From 29dd2455a28eead2be42115eaf2fe28c26401d31 Mon Sep 17 00:00:00 2001 From: dgsasha Date: Fri, 12 May 2023 16:41:07 -0400 Subject: [PATCH 1/6] Initial windows support --- .gitignore | 2 + LICENSE | 674 +++++++++++++++++ README.md | 47 +- ...thub.remindersdevs.Reminders.desktop.in.in | 2 +- ....github.remindersdevs.Reminders.service.in | 2 +- data/browser/meson.build | 28 +- ...o.github.remindersdevs.Reminders.Devel.ico | Bin 0 -> 233798 bytes .../io.github.remindersdevs.Reminders.ico | Bin 0 -> 220901 bytes data/icons/meson.build | 8 +- data/icons/svg_to_ico.ps1 | 6 + data/icons/svg_to_ico.sh | 5 + ...hub.remindersdevs.Reminders.gschema.xml.in | 2 +- ...remindersdevs.Reminders.metainfo.xml.in.in | 2 +- data/meson.build | 52 +- ...indersdevs.Reminders.Service.desktop.in.in | 5 +- ...remindersdevs.Reminders.Service.service.in | 2 +- data/service/meson.build | 80 +-- flatpak/python3-modules.json | 37 +- flatpak/requirements.in | 1 + flatpak/requirements.txt | 17 + meson.build | 71 +- meson_options.txt | 2 +- po/POTFILES | 8 +- po/remembrance.pot | 210 +++--- src/browser/__init__.py | 7 - src/browser/about.py | 13 +- src/browser/application.py | 150 +++- src/browser/caldav_sign_in.py | 4 + src/browser/calendar.py | 52 +- src/browser/edit_lists_window.py | 8 + src/browser/error_dialog.py | 14 +- src/browser/export_lists_window.py | 7 + src/browser/import_lists_window.py | 7 + src/browser/main_window.py | 33 +- src/browser/meson.build | 6 +- src/browser/microsoft_sign_in.py | 9 +- src/browser/move_reminders_window.py | 8 + src/browser/preferences.py | 19 +- src/browser/reminder.py | 3 + src/browser/reminders.py | 36 +- src/browser/resources/meson.build | 4 +- src/browser/resources/ui/main_window.ui | 6 +- src/browser/shortcuts_window.py | 4 + src/info.py | 20 +- src/meson.build | 22 +- src/service/application.py | 75 +- src/service/backend.py | 112 ++- src/service/caldav.py | 30 +- src/service/countdowns.py | 60 +- src/service/icalendar.py | 6 +- src/service/meson.build | 8 +- src/service/ms_to_do.py | 78 +- src/service/queue.py | 5 +- src/service/reminders-service.py | 34 +- windows/LICENSE.rtf | 679 ++++++++++++++++++ windows/Product.wxs | 88 +++ windows/Reminders.spec.in | 108 +++ windows/Reminders.wixproj | 33 + windows/build_windows.ps1 | 63 ++ windows/freeze.py | 30 + windows/localization/en-US.wxl | 12 + windows/package-msys2.sh | 120 ++++ windows/settings.ini | 3 + 63 files changed, 2755 insertions(+), 484 deletions(-) create mode 100644 LICENSE create mode 100644 data/icons/io.github.remindersdevs.Reminders.Devel.ico create mode 100644 data/icons/io.github.remindersdevs.Reminders.ico create mode 100644 data/icons/svg_to_ico.ps1 create mode 100644 data/icons/svg_to_ico.sh create mode 100644 windows/LICENSE.rtf create mode 100644 windows/Product.wxs create mode 100644 windows/Reminders.spec.in create mode 100644 windows/Reminders.wixproj create mode 100644 windows/build_windows.ps1 create mode 100644 windows/freeze.py create mode 100644 windows/localization/en-US.wxl create mode 100644 windows/package-msys2.sh create mode 100644 windows/settings.ini diff --git a/.gitignore b/.gitignore index dd928d9..f131d7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ build build-dir .flatpak-builder +out +obj diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index 6036269..becdb37 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
![Reminders](data/icons/io.github.remindersdevs.Reminders.svg) -# Reminders, an open source reminder app +# Reminders, a cross platform and open source reminder app Download on Flathub @@ -38,7 +38,6 @@ flatpak install flathub org.gnome.Platform//44 ``` You will also need `flatpak-builder` - ### Building (Flatpak): ``` flatpak-builder --user --install --force-clean build-dir flatpak/io.github.remindersdevs.Reminders.yml @@ -47,22 +46,51 @@ flatpak-builder --user --install --force-clean build-dir flatpak/io.github.remin flatpak run io.github.remindersdevs.Reminders.Devel --restart-service ``` -### Dependencies (generic): +### Building (Windows): +You need at least Windows 10 to install Reminders, but you can probably build it on older versions of Windows + +Install [MSYS2](https://www.msys2.org/) + +Install [.NET SDK](https://dotnet.microsoft.com/en-us/download) + +Install [WiX Toolset](https://wixtoolset.org/docs/intro/) +``` +dotnet tool install --global wix --version 4.0.0 +``` + +MSYS2 will be used to build the app in a unix environment (Arch based), and all of the dependencies will be automatically installed. .NET and WiX are used to build the installer. MSI installers go in ./out, but you can run the exes directly in ./build, just move them to ./build/reminders/bin before running them. You need to install the app once to get notifications working though. + +``` +./windows/build_windows.ps1 -msi +``` +``` +Usage: build_windows.ps1 [options...] +Options: + -arches Can be x86, x64, or arm64. Comma separated list, default is amd64. + -root MSYS2 root path, default is 'C:\msys64'. + -msi Build an msi installer + -help Display this message. +``` + +### Dependencies (generic linux): +- `Libadwaita` >= 1.2 +- `GTK` >= 4.10 - `PyGObject` - `Meson` -- `Libadwaita` - `GLib` -- `GSound` -- `WebKitGTK` - `python3-msal` - `python3-requests` - `python3-caldav` - `python3-icalendar` - `python3-setuptools` +- `python3-keyring` +- `GSound` +- `WebKitGTK` +- `Libsecret` -### Building (generic): +### Building (generic linux): ``` -meson build -Ddevel=true +meson setup build -Ddevel=true ``` ``` ninja -C build install @@ -72,8 +100,7 @@ remembrance --restart-service ``` ## Todo -- Windows port (Need to look into dbus support on Windows) -- Add a debug mode and make it easier to get logs +- Make log files debug logs (Need to add more logging code) - Maybe make a GNOME Shell extension that lets you view your reminders (This probably will never happen) - Maybe integrate the search with GNOME Shell (Also probably not happening) diff --git a/data/browser/io.github.remindersdevs.Reminders.desktop.in.in b/data/browser/io.github.remindersdevs.Reminders.desktop.in.in index 40ba4b3..64b3f19 100644 --- a/data/browser/io.github.remindersdevs.Reminders.desktop.in.in +++ b/data/browser/io.github.remindersdevs.Reminders.desktop.in.in @@ -2,7 +2,7 @@ Type=Application Name=Reminders Comment=Set reminders and manage tasks -Exec=@BINDIR@/@APP_EXECUTABLE@ %U +Exec=@EXEC@ %U Icon=@APP_ID@ Terminal=false StartupWMClass=@APP_ID@ diff --git a/data/browser/io.github.remindersdevs.Reminders.service.in b/data/browser/io.github.remindersdevs.Reminders.service.in index dfb0d01..6c7e10b 100644 --- a/data/browser/io.github.remindersdevs.Reminders.service.in +++ b/data/browser/io.github.remindersdevs.Reminders.service.in @@ -1,3 +1,3 @@ [D-BUS Service] Name=@APP_ID@ -Exec=@BINDIR@/@APP_EXECUTABLE@ +Exec=@EXEC@ diff --git a/data/browser/meson.build b/data/browser/meson.build index 7b5fe62..f34829a 100644 --- a/data/browser/meson.build +++ b/data/browser/meson.build @@ -1,8 +1,3 @@ -conf = configuration_data() -conf.set('APP_EXECUTABLE', app_executable) -conf.set('APP_ID', app_id) -conf.set('BINDIR', get_option('prefix') / get_option('bindir')) - desktop_file = configure_file( input: 'io.github.remindersdevs.Reminders.desktop.in.in', output: '@0@.desktop.in'.format(app_id), @@ -10,26 +5,25 @@ desktop_file = configure_file( ) desktop = i18n.merge_file( - input: desktop_file, - output: '@0@.desktop'.format(app_id), - type: 'desktop', - po_dir: '../../po', - install: true, - install_dir: join_paths(get_option('datadir'), 'applications') + input: desktop_file, + output: '@0@.desktop'.format(app_id), + type: 'desktop', + po_dir: '../../po', + install: true, + install_dir: join_paths(get_option('datadir'), 'applications') ) desktop_utils = find_program('desktop-file-validate', required: false) -if desktop_utils.found() - test('Validate desktop file', desktop_utils, - args: [desktop] - ) + if desktop_utils.found() + test('Validate desktop file', desktop_utils, + args: [desktop] + ) endif - configure_file( input: 'io.github.remindersdevs.Reminders.service.in', output: '@0@.service'.format(app_id), install: true, - install_dir: get_option('datadir') / 'dbus-1/services', + install_dir: get_option('datadir') / 'dbus-1' / 'services', configuration: conf, ) diff --git a/data/icons/io.github.remindersdevs.Reminders.Devel.ico b/data/icons/io.github.remindersdevs.Reminders.Devel.ico new file mode 100644 index 0000000000000000000000000000000000000000..64554ad01bb85be40859fbd6646dab4af1ab7935 GIT binary patch literal 233798 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%0Akv8=m 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

X}sJ1VmC(L1WmE+Vws=~ZF+P(XofD1T>^Y1 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⁢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 a!F}Xpm)Q52clyj!V(;0zcI8>mJO2Zoyk#Q* literal 0 HcmV?d00001 diff --git a/data/icons/meson.build b/data/icons/meson.build index 45b9f82..ebb90d1 100644 --- a/data/icons/meson.build +++ b/data/icons/meson.build @@ -1,23 +1,23 @@ -dir = get_option('datadir') / 'icons/hicolor' +dir = get_option('datadir') / 'icons' / 'hicolor' if release_type == 'devel' install_data( 'io.github.remindersdevs.Reminders.Devel.svg', rename: app_id + '.svg', - install_dir: dir / 'scalable/apps', + install_dir: dir / 'scalable' / 'apps', ) else install_data( 'io.github.remindersdevs.Reminders.svg', rename: app_id + '.svg', - install_dir: dir / 'scalable/apps', + install_dir: dir / 'scalable' / 'apps', ) endif install_data( 'io.github.remindersdevs.Reminders-symbolic.svg', rename: app_id + '-symbolic.svg', - install_dir: dir / 'symbolic/apps', + install_dir: dir / 'symbolic' / 'apps', ) diff --git a/data/icons/svg_to_ico.ps1 b/data/icons/svg_to_ico.ps1 new file mode 100644 index 0000000..d32927d --- /dev/null +++ b/data/icons/svg_to_ico.ps1 @@ -0,0 +1,6 @@ + +$IDS = @('io.github.remindersdevs.Reminders', 'io.github.remindersdevs.Reminders.Devel') +For ($i=0; $i -lt $IDS.Length; $i++) { + $id = $IDS[$i] + magick -density 256x256 -background none "${id}.svg" -define 'icon:auto-resize=256,96,80,72,64,60,48,40,36,32,30,24,20,16' -colors 256 "${id}.ico" +} diff --git a/data/icons/svg_to_ico.sh b/data/icons/svg_to_ico.sh new file mode 100644 index 0000000..2607a85 --- /dev/null +++ b/data/icons/svg_to_ico.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +for ID in 'io.github.remindersdevs.Reminders' 'io.github.remindersdevs.Reminders.Devel'; do + convert -density 256x256 -background none "${ID}.svg" -define 'icon:auto-resize=256,96,80,72,64,60,48,40,36,32,30,24,20,16' -colors 256 "${ID}.ico" +done diff --git a/data/io.github.remindersdevs.Reminders.gschema.xml.in b/data/io.github.remindersdevs.Reminders.gschema.xml.in index 58d25e7..fa0e2f8 100644 --- a/data/io.github.remindersdevs.Reminders.gschema.xml.in +++ b/data/io.github.remindersdevs.Reminders.gschema.xml.in @@ -1,5 +1,5 @@ - + diff --git a/data/io.github.remindersdevs.Reminders.metainfo.xml.in.in b/data/io.github.remindersdevs.Reminders.metainfo.xml.in.in index d2028b3..930172f 100644 --- a/data/io.github.remindersdevs.Reminders.metainfo.xml.in.in +++ b/data/io.github.remindersdevs.Reminders.metainfo.xml.in.in @@ -75,7 +75,7 @@ - @APP_EXECUTABLE@ + @PROJECT_NAME@ https://hosted.weblate.org/engage/reminders https://github.com/dgsasha/remembrance diff --git a/data/meson.build b/data/meson.build index ef7aaee..75a7e98 100644 --- a/data/meson.build +++ b/data/meson.build @@ -1,36 +1,35 @@ -conf = configuration_data() -conf.set('APP_EXECUTABLE', app_executable) -conf.set('APP_ID', app_id) -conf.set('SERVICE_ID', service_id) +if not on_windows + appstream_file = configure_file( + input: 'io.github.remindersdevs.Reminders.metainfo.xml.in.in', + output: '@0@.metainfo.xml.in'.format(app_id), + configuration: conf, + ) -appstream_file = configure_file( - input: 'io.github.remindersdevs.Reminders.metainfo.xml.in.in', - output: '@0@.metainfo.xml.in'.format(app_id), - configuration: conf, -) + appstream = i18n.merge_file( + input: appstream_file, + output: '@0@.metainfo.xml'.format(app_id), + po_dir: '../../po', + install: true, + install_dir: join_paths(get_option('datadir'), 'metainfo') + ) -appstream = i18n.merge_file( - input: appstream_file, - output: '@0@.metainfo.xml'.format(app_id), - po_dir: '../../po', - install: true, - install_dir: join_paths(get_option('datadir'), 'metainfo') -) + appstreamcli = find_program('appstreamcli', required: false) + if appstreamcli.found() + test( + 'Validate appstream file', + appstreamcli, + args: ['validate', '--no-net', appstream] + ) + endif -appstreamcli = find_program('appstreamcli', required: false) -if appstreamcli.found() - test( - 'Validate appstream file', - appstreamcli, - args: ['validate', '--no-net', appstream] - ) + subdir('browser') endif configure_file( input: 'io.github.remindersdevs.Reminders.gschema.xml.in', - output: '@0@..gschema.xml'.format(app_id), + output: '@0@.gschema.xml'.format(app_id), install: true, - install_dir: join_paths(get_option('datadir'), 'glib-2.0/schemas'), + install_dir: join_paths(get_option('datadir'), 'glib-2.0' / 'schemas'), configuration: conf, ) @@ -43,6 +42,5 @@ if compile_schemas.found() ) endif -subdir('service') -subdir('browser') subdir('icons') +subdir('service') diff --git a/data/service/io.github.remindersdevs.Reminders.Service.desktop.in.in b/data/service/io.github.remindersdevs.Reminders.Service.desktop.in.in index dd57d3f..a0088d0 100644 --- a/data/service/io.github.remindersdevs.Reminders.Service.desktop.in.in +++ b/data/service/io.github.remindersdevs.Reminders.Service.desktop.in.in @@ -1,7 +1,8 @@ [Desktop Entry] Type=Application -Name=Remembrance Service -Exec=@LIBEXECDIR@/@SERVICE_EXECUTABLE@ +Name=Reminders Service +Comment=DBus service for managing reminders and tasks +Exec=@SERVICE_EXEC@ Icon=@APP_ID@ Terminal=false NoDisplay=true diff --git a/data/service/io.github.remindersdevs.Reminders.Service.service.in b/data/service/io.github.remindersdevs.Reminders.Service.service.in index fe52706..5089f49 100644 --- a/data/service/io.github.remindersdevs.Reminders.Service.service.in +++ b/data/service/io.github.remindersdevs.Reminders.Service.service.in @@ -1,3 +1,3 @@ [D-BUS Service] Name=@SERVICE_ID@ -Exec=@LIBEXECDIR@/@SERVICE_EXECUTABLE@ +Exec=@SERVICE_EXEC@ diff --git a/data/service/meson.build b/data/service/meson.build index 56625e1..4eec649 100644 --- a/data/service/meson.build +++ b/data/service/meson.build @@ -1,56 +1,50 @@ -conf = configuration_data() -conf.set('SERVICE_EXECUTABLE', service_executable) -conf.set('SERVICE_ID', service_id) -conf.set('SERVICE_INTERFACE', service_interface) -conf.set('VERSION', meson.project_version()) -conf.set('APP_ID', app_id) -conf.set('LIBEXECDIR', get_option('prefix') / get_option('libexecdir')) +if not on_windows + desktop_file = configure_file( + input: 'io.github.remindersdevs.Reminders.Service.desktop.in.in', + output: '@0@.desktop.in'.format(service_id), + configuration: conf, + ) -desktop_file = configure_file( - input: 'io.github.remindersdevs.Reminders.Service.desktop.in.in', - output: '@0@.desktop.in'.format(service_id), - configuration: conf, -) + desktop = i18n.merge_file( + input: desktop_file, + output: '@0@.desktop'.format(service_id), + type: 'desktop', + po_dir: '../../po', + install: true, + install_dir: get_option('sysconfdir') / 'xdg' / 'autostart', + ) -desktop = i18n.merge_file( - input: desktop_file, - output: '@0@.desktop'.format(service_id), - type: 'desktop', - po_dir: '../../po', - install: true, - install_dir: get_option('sysconfdir') / 'xdg/autostart', -) + meson.add_install_script( + 'cp', + get_option('prefix') / get_option('sysconfdir') / 'xdg' / 'autostart' / '@0@.desktop'.format(service_id), + get_option('prefix') / get_option('datadir') / 'applications' + ) -meson.add_install_script( - 'cp', - get_option('prefix') / get_option('sysconfdir') / 'xdg/autostart' / '@0@.desktop'.format(service_id), - get_option('prefix') / get_option('datadir') / 'applications' -) + desktop_utils = find_program('desktop-file-validate', required: false) + if desktop_utils.found() + test('Validate desktop file', desktop_utils, + args: [desktop] + ) + endif -desktop_utils = find_program('desktop-file-validate', required: false) -if desktop_utils.found() - test('Validate desktop file', desktop_utils, - args: [desktop] + install_data( + 'notification.ogg', + install_dir: get_option('datadir') / 'sounds' / meson.project_name(), ) -endif -configure_file( - input: 'io.github.remindersdevs.Reminders.Service.service.in', - output: '@0@.service'.format(service_id), - install: true, - install_dir: get_option('datadir') / 'dbus-1/services', - configuration: conf, -) - -install_data( - 'notification.ogg', - install_dir: get_option('datadir') / 'sounds' / app_executable, -) + configure_file( + input: 'io.github.remindersdevs.Reminders.Service.service.in', + output: '@0@.service'.format(service_id), + install: true, + install_dir: get_option('datadir') / 'dbus-1' / 'services', + configuration: conf, + ) +endif configure_file( input: 'io.github.remindersdevs.Reminders.Service.xml.in', output: '@0@.xml'.format(service_interface), install: true, - install_dir: get_option('datadir') / 'dbus-1/interfaces', + install_dir: get_option('prefix') / get_option('datadir') / meson.project_name(), configuration: conf, ) diff --git a/flatpak/python3-modules.json b/flatpak/python3-modules.json index 0827812..58bad93 100644 --- a/flatpak/python3-modules.json +++ b/flatpak/python3-modules.json @@ -2,7 +2,7 @@ "name": "python3-modules", "buildsystem": "simple", "build-commands": [ - "pip3 install --verbose --ignore-installed --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} --no-build-isolation caldav certifi cffi charset-normalizer cryptography icalendar idna lxml msal pycparser pyjwt python-dateutil pytz pytz-deprecation-shim recurring-ical-events requests six tzdata tzlocal urllib3 vobject x-wr-timezone" + "pip3 install --verbose --ignore-installed --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} --no-build-isolation caldav certifi cffi charset-normalizer cryptography icalendar idna importlib-metadata jaraco-classes jeepney keyring lxml more-itertools msal pycparser pyjwt python-dateutil pytz pytz-deprecation-shim recurring-ical-events requests secretstorage six tzdata tzlocal urllib3 vobject x-wr-timezone zipp" ], "sources": [ { @@ -51,6 +51,26 @@ "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/30/bb/bf2944b8b88c65b797acc2c6a2cb0fb817f7364debf0675792e034013858/importlib_metadata-6.6.0-py3-none-any.whl", + "sha256": "43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/60/28/220d3ae0829171c11e50dded4355d17824d60895285631d7eb9dee0ab5e5/jaraco.classes-3.2.3-py3-none-any.whl", + "sha256": "2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl", + "sha256": "c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/62/db/0e9a09b2b95986dcd73ac78be6ed2bd73ebe8bac65cba7add5b83eb9d899/keyring-23.13.1-py3-none-any.whl", + "sha256": "771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd" + }, { "type": "file", "url": "https://files.pythonhosted.org/packages/46/f5/3f61ae971a41c993ce3365e92354090ebf661426cb96fdc826108a9c31a2/lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", @@ -75,6 +95,11 @@ "aarch64" ] }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/85/01/e2678ee4e0d7eed4fd6be9e5b043fff9d22d245d06c8c91def8ced664189/more_itertools-9.1.0-py3-none-any.whl", + "sha256": "d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3" + }, { "type": "file", "url": "https://files.pythonhosted.org/packages/5a/0d/5e21072561e8cbf13f938da854804cde984475e9b3d125922962e46487b8/msal-1.22.0-py2.py3-none-any.whl", @@ -115,6 +140,11 @@ "url": "https://files.pythonhosted.org/packages/d2/f4/274d1dbe96b41cf4e0efb70cbced278ffd61b5c7bb70338b62af94ccb25b/requests-2.28.2-py3-none-any.whl", "sha256": "64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa" }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl", + "sha256": "f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99" + }, { "type": "file", "url": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", @@ -144,6 +174,11 @@ "type": "file", "url": "https://files.pythonhosted.org/packages/c6/38/05bcb43df0db48922426845380eeaea88875807050b9ac4aff099d775ae5/x_wr_timezone-0.0.5-py3-none-any.whl", "sha256": "e438b27b96635f5f712a4fb5dda4c82597a53a412fe834c9fe8409fddb3fc2b1" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/5b/fa/c9e82bbe1af6266adf08afb563905eb87cab83fde00a0a08963510621047/zipp-3.15.0-py3-none-any.whl", + "sha256": "48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556" } ] } diff --git a/flatpak/requirements.in b/flatpak/requirements.in index d5e5f11..12e71d4 100644 --- a/flatpak/requirements.in +++ b/flatpak/requirements.in @@ -2,3 +2,4 @@ msal==1.22.0 requests==2.28.2 caldav==1.2.1 setuptools==67.7.2 +keyring==23.13.1 diff --git a/flatpak/requirements.txt b/flatpak/requirements.txt index e687f84..8b45738 100644 --- a/flatpak/requirements.txt +++ b/flatpak/requirements.txt @@ -16,6 +16,7 @@ cryptography==40.0.2 # via # msal # pyjwt + # secretstorage icalendar==5.0.5 # via # caldav @@ -23,8 +24,20 @@ icalendar==5.0.5 # x-wr-timezone idna==3.4 # via requests +importlib-metadata==6.6.0 + # via keyring +jaraco-classes==3.2.3 + # via keyring +jeepney==0.8.0 + # via + # keyring + # secretstorage +keyring==23.13.1 + # via -r requirements.in lxml==4.9.2 # via caldav +more-itertools==9.1.0 + # via jaraco-classes msal==1.22.0 # via -r requirements.in pycparser==2.21 @@ -51,6 +64,8 @@ requests==2.28.2 # -r requirements.in # caldav # msal +secretstorage==3.3.3 + # via keyring six==1.16.0 # via python-dateutil tzdata==2023.3 @@ -63,6 +78,8 @@ vobject==0.9.6.1 # via caldav x-wr-timezone==0.0.5 # via recurring-ical-events +zipp==3.15.0 + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/meson.build b/meson.build index 84a7b9c..20d819b 100644 --- a/meson.build +++ b/meson.build @@ -1,17 +1,32 @@ project( 'reminders', version: '5.0', - meson_version: '>= 0.59', - default_options: ['prefix=/usr'] + meson_version: '>= 0.59' +) + +host_os = host_machine.system().to_lower() + +on_windows = ( + host_os.contains('mingw') or + host_os.contains('cygwin') or + host_os.contains('windows') ) dependency('glib-2.0') dependency('pygobject-3.0') -dependency('libadwaita-1') +dependency('libadwaita-1', version: '>=1.2') +dependency('gtk4',version: '>=4.10') + +if not on_windows + dependency('gsound') + dependency('libsecret-1') + dependency('webkitgtk-6.0') +endif release_type = get_option('release-type') -app_executable = meson.project_name() +app_file = meson.project_name() +app_executable = on_windows ? 'Reminders.exe' : app_file base_app_id = 'io.github.remindersdevs.Reminders' beta_app_id = base_app_id + '.Beta' @@ -32,22 +47,62 @@ else path = base_path endif -service_executable = app_executable + '-service' +service_file = app_file + '-service' +service_executable = on_windows ? 'Reminders Service.exe' : service_file service_id = app_id + '.Service' service_interface = service_id service_object = path + '/Service' i18n = import('i18n') -localedir = get_option('localedir') -gnome = import('gnome') python = import('python').find_installation('python3') +gnome = import('gnome') + +data_dir = on_windows ? 'share' : get_option('prefix') / get_option('datadir') + +conf = configuration_data() +conf.set('VERSION', meson.project_version()) +conf.set('APP_EXECUTABLE', app_executable) +conf.set('BASE_APP_ID', base_app_id) +conf.set('APP_ID', app_id) +conf.set('PROJECT_NAME', meson.project_name()) +conf.set('APP_OBJECT', path) +conf.set('SERVICE_ID', service_id) +conf.set('SERVICE_INTERFACE', service_interface) +conf.set('SERVICE_EXECUTABLE', service_executable) +conf.set('SERVICE_OBJECT', service_object) +conf.set('PORTALS_ENABLED', get_option('enable-portals') ? 'True' : 'False') +conf.set('CLIENT_ID', get_option('client-id')) +conf.set('PYTHON_PATH', python.full_path()) +conf.set('DATA_DIR', data_dir) +conf.set('LOCALE_DIR', data_dir / 'locale') +conf.set('SERVICE_EXEC', get_option('prefix') / get_option('bindir') / service_executable) +conf.set('EXEC', get_option('prefix') / get_option('bindir') / app_executable) + subdir('po') subdir('data') subdir('src') +if on_windows + conf = configuration_data() + conf.set('REMINDERS', get_option('prefix') / get_option('bindir') / app_file) + conf.set('REMINDERS_SERVICE', get_option('prefix') / get_option('bindir') / service_file) + conf.set('ICON', meson.current_source_dir() / 'data' / 'icons' / app_id + '.ico') + conf.set('VERSION', get_option('prefix') / 'tmp' / 'Reminders.txt') + conf.set('SERVICE_VERSION', get_option('prefix') / 'tmp' / 'Reminders Service.txt') + conf.set('LIB', get_option('prefix') / 'lib') + + reminders_spec = configure_file( + input : 'windows' / 'Reminders.spec.in', + output : 'Reminders.spec', + configuration : conf + ) + + meson.add_install_script('windows' / 'freeze.py', reminders_spec, get_option('prefix')) +endif + gnome.post_install( glib_compile_schemas: true, gtk_update_icon_cache: true, - update_desktop_database: true, + update_desktop_database: not on_windows ) diff --git a/meson_options.txt b/meson_options.txt index 565bf00..aa79821 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,3 +1,3 @@ -option('enable-portals', type: 'boolean', value: 'false', description: 'enable libportal, used by the flatpak') +option('enable-portals', type: 'boolean', value: false, description: 'enable libportal, used by the flatpak') option('release-type', type : 'combo', choices: ['stable', 'beta', 'devel'], value : 'stable') option('client-id', type : 'string', value : '75c0b88f-6c54-4679-b6bd-18ed15e7dedf') diff --git a/po/POTFILES b/po/POTFILES index cd92b0d..be734f7 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -1,9 +1,9 @@ # List of source files containing translatable strings. # Please keep this file sorted alphabetically. -data/browser/io.github.dgsasha.Remembrance.desktop.in.in -data/service/io.github.dgsasha.Remembrance.Service3.desktop.in.in -data/io.github.dgsasha.Remembrance.gschema.xml.in -data/io.github.dgsasha.Remembrance.metainfo.xml.in.in +data/browser/io.github.remindersdevs.Reminders.desktop.in.in +data/service/io.github.remindersdevs.Reminders.Service.desktop.in.in +data/io.github.remindersdevs.Reminders.gschema.xml.in +data/io.github.remindersdevs.Reminders.metainfo.xml.in.in src/browser/resources/ui/caldav_sign_in.ui src/browser/resources/ui/edit_lists_window.ui src/browser/resources/ui/error_dialog.ui diff --git a/po/remembrance.pot b/po/remembrance.pot index 5132959..87fcb05 100644 --- a/po/remembrance.pot +++ b/po/remembrance.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: remembrance\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-05-02 16:55-0400\n" +"POT-Creation-Date: 2023-05-03 14:51-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,399 +17,401 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: data/browser/io.github.dgsasha.Remembrance.desktop.in.in:4 -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:9 -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:66 src/info.py:8 +#: data/browser/io.github.remindersdevs.Reminders.desktop.in.in:4 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:9 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:66 src/info.py:8 msgid "Reminders" msgstr "" -#: data/browser/io.github.dgsasha.Remembrance.desktop.in.in:5 -msgid "Set reminders for yourself" +#: data/browser/io.github.remindersdevs.Reminders.desktop.in.in:5 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:10 +msgid "Set reminders and manage tasks" msgstr "" -#: data/browser/io.github.dgsasha.Remembrance.desktop.in.in:13 +#: data/browser/io.github.remindersdevs.Reminders.desktop.in.in:13 msgid "" "Todo;Productivity;Task;Planning;Planner;Time;Management;Reminder;Remembrance;" "Reminders;" msgstr "" -#: data/service/io.github.dgsasha.Remembrance.Service3.desktop.in.in:4 +#: data/service/io.github.remindersdevs.Reminders.Service.desktop.in.in:4 msgid "Remembrance Service" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:23 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:23 #: src/browser/resources/ui/preferences.ui:113 msgid "Time format" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:24 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:24 msgid "What format to display the time in" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:28 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:28 #: src/browser/resources/ui/main_window.ui:62 msgid "Sort by" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:29 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:29 msgid "How to sort the reminders" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:33 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:33 #: src/browser/resources/ui/preferences.ui:94 msgid "Auto refresh frequency" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:34 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:34 msgid "How often the reminders are refreshed (minutes)" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:38 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:38 msgid "Notification Sound" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:39 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:39 msgid "Whether or not to play a notification sound" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:43 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:43 msgid "Use included notification sound" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:44 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:44 msgid "Whether to use the included notification sound" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:48 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:48 msgid "Descending sort" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:49 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:49 msgid "If reminders sort should be descending" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:53 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:53 msgid "Week starts on sunday" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:54 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:54 msgid "If week should start on sunday" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:67 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:67 msgid "Remote lists that should be synced" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:68 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:68 msgid "" "Add a user id if you want to sync all of the lists on a user, or any list id " "on the user" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:72 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:72 msgid "Selected list" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:73 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:73 msgid "list ids can be 'all', 'local', or an actual id" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:77 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:77 msgid "[DEPRECATED] Task lists that should be synced" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:78 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:78 msgid "" "{user_id: [task_list_ids]}, task_list_ids can be 'all' or an array of ids" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:82 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:82 msgid "[DEPRECATED] Task lists that should be visible" msgstr "" -#: data/io.github.dgsasha.Remembrance.gschema.xml.in:83 +#: data/io.github.remindersdevs.Reminders.gschema.xml.in:83 msgid "(user_id, task_id) ids can be 'all', 'local', or an actual id" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:10 -msgid "Set reminders and manage tasks" +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:6 +#: src/browser/about.py:50 +msgid "Reminders Developers" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:13 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:13 msgid "What you can do with Reminders:" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:15 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:15 msgid "Set recurring reminders" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:16 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:16 msgid "Schedule notifications" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:17 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:17 msgid "Sort, filter, and search for reminders" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:18 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:18 msgid "Mark reminders as important or complete" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:19 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:19 msgid "Organize reminders using lists" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:20 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:20 msgid "Optionally play a sound when notifications are sent" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:21 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:21 msgid "Optionally sync with Microsoft To Do" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:22 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:22 msgid "Optionally sync with CalDAV servers" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:23 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:23 msgid "Import and export ical/ics files" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:57 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:57 msgid "Todo" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:58 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:58 msgid "Productivity" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:59 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:59 msgid "Task" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:60 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:60 msgid "Planning" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:61 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:61 msgid "Planner" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:62 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:62 #: src/browser/resources/ui/reminder_edit_window.ui:87 msgid "Time" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:63 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:63 msgid "Management" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:64 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:64 msgid "Reminder" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:65 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:65 msgid "Remembrance" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:87 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:87 msgid "UI improvements" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:88 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:88 msgid "Added support for making the week start on sunday" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:89 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:89 msgid "" "Added indicators that show how many incomplete reminders are in each list/" "group" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:90 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:90 msgid "Added support for syncing with CalDAV servers" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:91 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:91 msgid "" "Added support for selecting multiple reminders in one click by holding shift" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:92 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:92 msgid "Added support for dragging and dropping reminders between lists" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:93 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:93 msgid "Added support for importing and exporting ical/ics files" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:94 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:94 msgid "Added more multithreading to significantly speed up certain operations" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:95 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:95 msgid "Added support for syncing recurring reminders with Microsoft To Do" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:96 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:96 msgid "Added support for creating monthly and yearly repeating reminders" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:97 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:97 msgid "" "Version numbers are now handled in a logical way (as in they aren't just " "doubles)" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:98 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:98 msgid "" "Microsoft sign in window now appears in the app instead of in the browser" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:99 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:99 msgid "Significantly improve how recurring reminders function" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:100 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:100 msgid "Fix date/time text wrapping awkwardly" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:101 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:101 msgid "Improvements to handling of network errors" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:102 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:102 msgid "Fix some other minor issues" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:103 -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:207 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:103 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:207 msgid "Bump API version" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:110 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:110 msgid "Fix versioning by bumping to 4.0" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:117 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:117 msgid "Remove warning about cloud syncing being in beta" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:118 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:118 msgid "Fix issue where you could make reminder recurring when it shouldn't be" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:125 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:125 msgid "Change delete icon" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:126 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:126 msgid "Fix some ui bugs" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:127 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:127 msgid "Some tiny performance improvements" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:128 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:128 msgid "Improve logging" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:135 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:135 msgid "UI Improvements to sidebar" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:136 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:136 msgid "Fix issues when moving reminders between lists" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:137 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:137 msgid "Fix issue with error dialogs" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:144 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:144 msgid "Fix issue when deleting lists" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:151 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:151 msgid "Fix issue when removing selected reminders" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:158 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:158 msgid "Performance improvements" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:159 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:159 msgid "Don't freeze UI when updating MS reminders" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:160 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:160 msgid "Automatically refresh reminders after waking from suspend" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:161 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:161 msgid "Fix issues with deleting lists" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:162 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:162 msgid "Fix issues when queueing remote changes while internet is disconnected" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:169 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:169 msgid "Stop showing completed reminders on upcoming page" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:170 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:170 msgid "Cross out completed reminders on all reminders page" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:177 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:177 msgid "Add support for setting due dates without sending notifications" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:178 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:178 msgid "" "Add support for selecting and editing multiple reminders (Start selecting " "with Ctrl + LMB or by pressing and holding a reminder)" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:179 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:179 msgid "Slightly improve error handling" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:186 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:186 msgid "Fix issue when setting reminders in another year" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:193 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:193 msgid "Fix issue when saving Microsoft To Do Reminders" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:200 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:200 msgid "New notification sound" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:201 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:201 msgid "Allow sorting reminders by created time and last updated time" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:202 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:202 msgid "Allow marking reminders as important" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:203 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:203 msgid "Slightly improved UI" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:204 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:204 msgid "Added keyboard shortcuts page" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:205 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:205 msgid "Added more keyboard shortcuts" msgstr "" -#: data/io.github.dgsasha.Remembrance.metainfo.xml.in.in:206 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:206 msgid "Lots of bugfixes" msgstr "" @@ -929,7 +931,7 @@ msgid "Save changes" msgstr "" #: src/browser/about.py:51 -msgid "Copyright 2023 Sasha Hale" +msgid "Copyright 2023 Reminders Developers" msgstr "" #. Translators: Do not translate this, instead put your name and email here. @@ -1232,14 +1234,14 @@ msgstr "" msgid "AM" msgstr "" -#: src/service/backend.py:634 +#: src/service/backend.py:638 msgid "Mark as completed" msgstr "" -#: src/service/backend.py:1015 +#: src/service/backend.py:1019 msgid "Local Reminders" msgstr "" -#: src/service/backend.py:1676 +#: src/service/backend.py:1680 msgid "Local" msgstr "" diff --git a/src/browser/__init__.py b/src/browser/__init__.py index fca9eaa..e69de29 100644 --- a/src/browser/__init__.py +++ b/src/browser/__init__.py @@ -1,7 +0,0 @@ -from gi.repository import Gio - -from reminders import info -from pathlib import Path - -resource = Gio.Resource.load(f'{Path(__file__).parent.absolute()}/{info.app_executable}.gresource') -resource._register() diff --git a/src/browser/about.py b/src/browser/about.py index 2b0d6bf..13d4fd6 100644 --- a/src/browser/about.py +++ b/src/browser/about.py @@ -14,7 +14,7 @@ # this program. If not, see . from reminders import info -from gi.repository import Adw, Gtk +from gi.repository import Adw, Gtk, GLib from gettext import gettext as _ RELEASE_NOTES = ''' @@ -40,7 +40,7 @@ ''' def about_window(win): - win = Adw.AboutWindow( + abt_win = Adw.AboutWindow( modal = True, transient_for=win, application_name = info.app_name, @@ -54,9 +54,14 @@ def about_window(win): issue_url = 'https://github.com/remindersdevs/reminders/issues', release_notes = RELEASE_NOTES, release_notes_version = info.version, + debug_info = _(f'You can find application logs at {info.app_log} and {info.service_log}, submit these with your bug report.'), # Translators: Do not translate this, instead put your name and email here. # name translator_credits = _("translator-credits") ) - win.add_shortcut(Gtk.Shortcut.new(Gtk.ShortcutTrigger.parse_string('w'), Gtk.CallbackAction.new(lambda *args: win.close()))) - win.present() + abt_win.add_shortcut(Gtk.Shortcut.new(Gtk.ShortcutTrigger.parse_string('w'), Gtk.CallbackAction.new(lambda *args: abt_win.close()))) + + abt_win.present() + + if info.on_windows: + win.app.center_win_on_parent(abt_win) diff --git a/src/browser/application.py b/src/browser/application.py index e2cc5af..1a6ebd3 100644 --- a/src/browser/application.py +++ b/src/browser/application.py @@ -18,6 +18,7 @@ from gi import require_version +require_version('Gdk', '4.0') require_version('Gtk', '4.0') require_version('Adw', '1') @@ -34,15 +35,29 @@ from gettext import gettext as _ from pkg_resources import parse_version from traceback import format_exception +from os import environ, sep + +if info.on_windows: + from time import sleep + from subprocess import Popen, CREATE_NEW_CONSOLE + + import ctypes + + user32 = ctypes.windll.user32 + GetWindowRect = user32.GetWindowRect + SetWindowPos = user32.SetWindowPos + OffsetRect = user32.OffsetRect + CopyRect = user32.CopyRect + gdk_win32_surface_get_handle = ctypes.WinDLL('libgtk-4-1.dll').gdk_win32_surface_get_handle # Always update this when new features are added that require the service to restart MIN_SERVICE_VERSION = '5.0' -class Remembrance(Adw.Application): +class Reminders(Adw.Application): '''Application for the frontend''' def __init__(self, **kwargs): super().__init__(**kwargs) - self.restart = False + self.configure_logging() self.sandboxed = False self.preferences = None self.win = None @@ -57,18 +72,32 @@ def __init__(self, **kwargs): None ) self.add_main_option( - 'restart-service', ord('r'), + 'no-activate', ord('n'), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, - _('Restart service before starting app'), + _("Don't activate app, this might cause issues"), None ) self.add_main_option( - 'page', ord('p'), + 'action', ord('a'), GLib.OptionFlags.NONE, GLib.OptionArg.STRING, - _('Start on a different page'), - '(upcoming|past|completed)', + _('Run an action'), + None + ) + self.add_main_option( + 'params', ord('p'), + GLib.OptionFlags.NONE, + GLib.OptionArg.STRING, + _('String parameter for the action if required'), + None + ) + self.add_main_option( + 'restart-service', ord('r'), + GLib.OptionFlags.NONE, + GLib.OptionArg.NONE, + _('Restart service before starting app'), + None ) self.add_main_option( GLib.OPTION_REMAINING, @@ -82,21 +111,22 @@ def __init__(self, **kwargs): def do_command_line(self, command): commands = command.get_options_dict() - if commands.contains('restart-service'): - self.restart = True - if commands.contains('version'): print(info.version) sys.exit(0) - if commands.contains('page'): - value = commands.lookup_value('page').get_string() - if value in ('upcoming', 'past', 'completed'): - self.page = value - else: - print(f'{value} is not a valid page') + self.restart = commands.contains('restart-service') - self.do_activate() + if not commands.contains('no-activate'): + self.do_activate() + + if commands.contains('action'): + action = commands.lookup_value('action').get_string() + params = commands.lookup_value('params').get_string() if commands.contains('params') else None + try: + self.activate_action(action, GLib.Variant('s', params) if params is not None else params) + except Exception as error: + self.logger.exception(error) files = commands.lookup_value(GLib.OPTION_REMAINING) if files: @@ -106,7 +136,6 @@ def do_command_line(self, command): def do_startup(self): Adw.Application.do_startup(self) - self.configure_logging() self.refreshing = False if info.portals_enabled: @@ -117,7 +146,7 @@ def do_startup(self): if portal.running_under_sandbox(): self.sandboxed = True - if self.sandboxed: + if self.sandboxed or info.on_windows: # xdg-desktop-portal will try to run the actions from the backend here when the notification is interacted with # for now, we can just add the action here if the app is sandboxed # later I will probably make the frontend of the app the owner of the notification to simplify things @@ -150,15 +179,15 @@ def check_service_version(self): def do_activate(self): Adw.Application.do_activate(self) - self.provider = Gtk.CssProvider() - self.provider.load_from_resource('/io/github/remindersdevs/Reminders/stylesheet.css') - if win := self.get_active_window(): self.win = win self.win.activate_action(f'win.{self.page}', None) self.win.present() return + self.provider = Gtk.CssProvider() + self.provider.load_from_resource('/io/github/remindersdevs/Reminders/stylesheet.css') + self.connect_to_service() self.check_service_version() @@ -321,6 +350,45 @@ def reminder_deleted_cb(self, proxy, sender_name, signal_name, parameters): self.win.invalidate_filter() def connect_to_service(self): + if info.on_windows: + # Can't autostart dbus services on windows + if info.service_executable.endswith('exe'): + Popen([environ['REMINDERS_PATH'] + sep + info.service_executable], creationflags=CREATE_NEW_CONSOLE) + else: + Popen([sys.executable, environ['REMINDERS_PATH'] + sep + info.service_executable], creationflags=CREATE_NEW_CONSOLE) + self.found = False + def cb(): + self.found = True + timeout = GLib.timeout_add_seconds(10, self.timeout_error) + context = GLib.MainContext.new() + context.push_thread_default() + watcher_id = self.watch(cb) + while not self.found: + sleep(0.5) + context.iteration(True) + context.pop_thread_default() + GLib.source_remove(timeout) + self.do_connect(watcher_id) + else: + self.do_connect() + + def timeout_error(self): + self.logger.error('Failed to connect to service') + sys.exit(1) + + def watch(self, cb): + watcher_id = Gio.bus_watch_name( + Gio.BusType.SESSION, + info.service_id, + Gio.BusNameWatcherFlags.NONE, + lambda *args: cb(), + None + ) + return watcher_id + + def do_connect(self, watcher_id = None): + if watcher_id is not None: + Gio.bus_unwatch_name(watcher_id) self.service = Gio.DBusProxy.new_for_bus_sync( Gio.BusType.SESSION, Gio.DBusProxyFlags.NONE, @@ -333,7 +401,7 @@ def connect_to_service(self): if self.service is not None: self.logger.info('Connected to service') else: - self.logger.error('Faled to start proxy to connect to service') + self.logger.error('Failed to start proxy to connect to service') sys.exit(1) def run_service_method(self, method, parameters, sync = True, callback = None, retry = True, show_error_dialog = True): @@ -408,6 +476,8 @@ def import_lists(self, action, data): filters.append(file_filter) dialog.set_filters(filters) dialog.open_multiple(self.win, None, self.open_cb) + if info.on_windows: + self.center_win_on_parent(dialog) def open_cb(self, dialog, result, data = None): try: @@ -423,10 +493,40 @@ def open_cb(self, dialog, result, data = None): def open_files(self, files): ImportListsWindow(self, files) + def center_win_on_parent(self, window, data=None): + ctypes.pythonapi.PyCapsule_GetPointer.restype = ctypes.c_void_p + ctypes.pythonapi.PyCapsule_GetPointer.argtypes = [ctypes.py_object] + pointer = ctypes.pythonapi.PyCapsule_GetPointer(window.get_native().get_surface().__gpointer__, None) + parent_pointer = ctypes.pythonapi.PyCapsule_GetPointer(window.get_transient_for().get_native().get_surface().__gpointer__, None) + gdk_win32_surface_get_handle.argtypes = [ctypes.c_void_p] + window_handle = gdk_win32_surface_get_handle(pointer) + parent_window_handle = gdk_win32_surface_get_handle(parent_pointer) + + RECT = (ctypes.c_long * 4) + parent_rect = RECT() + GetWindowRect(parent_window_handle, ctypes.byref(parent_rect)) + + window_rect = RECT() + GetWindowRect(window_handle, ctypes.byref(window_rect)) + + parent_rect_copy = RECT() + CopyRect(ctypes.byref(parent_rect_copy), ctypes.byref(parent_rect)) + + OffsetRect(ctypes.byref(window_rect), ctypes.c_int(window_rect[0] * -1), ctypes.c_int(window_rect[1] * -1)) + OffsetRect(ctypes.byref(parent_rect_copy), ctypes.c_int(parent_rect_copy[0] * -1), ctypes.c_int(parent_rect_copy[1] * -1)) + OffsetRect(ctypes.byref(parent_rect_copy), ctypes.c_int(window_rect[2] * -1), ctypes.c_int(window_rect[3] * -1)) + + new_x = parent_rect[0] + (parent_rect_copy[2] // 2) + new_y = parent_rect[1] + (parent_rect_copy[3] // 2) + + SetWindowPos(window_handle, 0, ctypes.c_int(new_x), ctypes.c_int(new_y), 0, 0, 0x0001 | 0x0004) # SWP_NOSIZE | SWP_NOZORDER + def show_preferences(self, action, data): if self.preferences is None: self.preferences = PreferencesWindow(self) self.preferences.present() + if info.on_windows: + self.center_win_on_parent(self.preferences) else: self.preferences.set_visible(True) @@ -437,7 +537,9 @@ def configure_logging(self): handler.setFormatter(formatter) self.logger = logging.getLogger(info.app_executable) self.logger.setLevel(logging.INFO) + file_handler = logging.FileHandler(info.app_log, 'w') self.logger.addHandler(handler) + self.logger.addHandler(file_handler) def refresh_reminders(self, action = None, data = None): if not self.refreshing: @@ -461,7 +563,7 @@ def quit_app(self, action, data): def main(): try: - app = Remembrance(application_id=info.app_id, flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE) + app = Reminders(application_id=info.app_id, flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE) return app.run(sys.argv) except: sys.exit(1) diff --git a/src/browser/caldav_sign_in.py b/src/browser/caldav_sign_in.py index ef1ee5b..b4809e7 100644 --- a/src/browser/caldav_sign_in.py +++ b/src/browser/caldav_sign_in.py @@ -33,8 +33,12 @@ def __init__(self, preferences, **kwargs): self.app = preferences.app self.add_shortcut(Gtk.Shortcut.new(Gtk.ShortcutTrigger.parse_string('w'), Gtk.CallbackAction.new(lambda *args: self.close()))) + self.present() + if info.on_windows: + self.app.center_win_on_parent(self) + def caldav_sign_in(self, name, url, username, password): try: self.app.run_service_method('CalDAVLogin', GLib.Variant('(ssss)', (name, url, username, password)), show_error_dialog=False) diff --git a/src/browser/calendar.py b/src/browser/calendar.py index e830151..6f61dfb 100644 --- a/src/browser/calendar.py +++ b/src/browser/calendar.py @@ -20,30 +20,32 @@ from reminders import info from logging import getLogger from time import time -from threading import Thread +if info.on_windows: + from winsdk.windows.system.threading import ThreadPoolTimer logger = getLogger(info.app_executable) -class Calendar(Thread): +class Calendar(): '''Updates date labels when day changes''' def __init__(self, win): self.win = win self.time = datetime.datetime.combine(datetime.date.today(), datetime.time()) - self.countdown_id = 0 - super().__init__(target=self.run_countdown) - self.start() + self.timer = 0 - self.connection = Gio.bus_get_sync(Gio.BusType.SYSTEM, None) - self.connection.signal_subscribe( - 'org.freedesktop.login1', - 'org.freedesktop.login1.Manager', - 'PrepareForSleep', - '/org/freedesktop/login1', - None, - Gio.DBusSignalFlags.NONE, - self.on_wake_from_suspend, - None - ) + if not info.on_windows: + self.connection = Gio.bus_get_sync(Gio.BusType.SYSTEM, None) + self.connection.signal_subscribe( + 'org.freedesktop.login1', + 'org.freedesktop.login1.Manager', + 'PrepareForSleep', + '/org/freedesktop/login1', + None, + Gio.DBusSignalFlags.NONE, + self.on_wake_from_suspend, + None + ) + + self.run_countdown() def on_wake_from_suspend(self, connection, sender, object, interface, signal, parameters, data = None): if parameters.unpack()[0]: @@ -57,12 +59,17 @@ def on_countdown_done(self): reminder.refresh_time() if self.win.reminder_edit_win is not None: self.win.reminder_edit_win.update_date_button_label() - self.countdown_id = 0 + self.timer = 0 self.run_countdown() return False def remove_countdown(self): - GLib.Source.remove(self.countdown_id) + if self.timer != 0 and self.timer is not None: + if info.on_windows: + self.timer.cancel() + else: + GLib.Source.remove(self.timer) + self.timer = 0 def run_countdown(self, new_day = True): try: @@ -70,14 +77,15 @@ def run_countdown(self, new_day = True): self.time += datetime.timedelta(days=1) self.timestamp = self.time.timestamp() - if self.countdown_id != 0: - GLib.Source.remove(self.countdown_id) - self.countdown_id = 0 + self.remove_countdown() now = time() wait = int(1000 * (self.timestamp - now)) if wait > 0: - self.countdown_id = GLib.timeout_add(wait, self.on_countdown_done) + if info.on_windows: + self.timer = ThreadPoolTimer.create_timer(lambda *args: self.on_countdown_done(), datetime.timedelta(milliseconds=wait)) + else: + self.timer = GLib.timeout_add(wait, self.on_countdown_done) else: self.on_countdown_done() except Exception as error: diff --git a/src/browser/edit_lists_window.py b/src/browser/edit_lists_window.py index c6011f9..7c3d4bf 100644 --- a/src/browser/edit_lists_window.py +++ b/src/browser/edit_lists_window.py @@ -99,7 +99,11 @@ def on_close(self, window = None): confirm_dialog.set_default_response('cancel') confirm_dialog.set_close_response('cancel') confirm_dialog.connect('response::yes', lambda *args: self.do_close()) + confirm_dialog.present() + + if info.on_windows: + self.win.app.center_win_on_parent(confirm_dialog) else: self.do_close() @@ -203,8 +207,12 @@ def show_delete_dialog(self): confirm_dialog.set_default_response('cancel') confirm_dialog.set_response_appearance('remove', Adw.ResponseAppearance.DESTRUCTIVE) confirm_dialog.connect('response::remove', lambda *args: self.delete()) + confirm_dialog.present() + if info.on_windows: + self.win.app.center_win_on_parent(confirm_dialog) + def delete(self): try: self.group.remove_child(self, self.user_id, self.list_id) diff --git a/src/browser/error_dialog.py b/src/browser/error_dialog.py index f3d5db8..43321d1 100644 --- a/src/browser/error_dialog.py +++ b/src/browser/error_dialog.py @@ -13,7 +13,9 @@ # You should have received a copy of the GNU General Public License along with # this program. If not, see . -from gi.repository import Gtk, Adw +from gi.repository import Gtk, Adw, GLib + +from reminders import info @Gtk.Template(resource_path='/io/github/remindersdevs/Reminders/ui/error_dialog.ui') class ErrorDialog(Adw.Window): @@ -27,6 +29,8 @@ def __init__(self, app, title: str, body: str, error: str, parent_window = None, self.set_title(title) self.body.set_label(body) self.error.set_buffer(Gtk.TextBuffer(text=error)) + self.add_shortcut(Gtk.Shortcut.new(Gtk.ShortcutTrigger.parse_string('w'), Gtk.CallbackAction.new(lambda *args: self.close()))) + if app.win is not None: if parent_window is None: parent_window = app.win @@ -38,9 +42,13 @@ def __init__(self, app, title: str, body: str, error: str, parent_window = None, parent_window = app.win.edit_lists_window self.set_transient_for(parent_window) self.set_modal(True) + + self.present() + + if info.on_windows: + app.center_win_on_parent(self) else: Gtk.StyleContext.add_provider_for_display(self.get_display(), app.provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) self.set_application(app) + self.present() - self.present() - self.add_shortcut(Gtk.Shortcut.new(Gtk.ShortcutTrigger.parse_string('w'), Gtk.CallbackAction.new(lambda *args: self.close()))) diff --git a/src/browser/export_lists_window.py b/src/browser/export_lists_window.py index a596f39..9592685 100644 --- a/src/browser/export_lists_window.py +++ b/src/browser/export_lists_window.py @@ -53,6 +53,9 @@ def __init__(self, app, *args, **kwargs): self.present() + if info.on_windows: + self.app.center_win_on_parent(self) + def launch_folder(self, uri): Gio.AppInfo.launch_default_for_uri(uri, None) self.close() @@ -85,6 +88,10 @@ def on_save(self, button = None): dialog.set_close_response('cancel') dialog.connect('response::close', lambda *args: self.close()) dialog.connect('response::yes', lambda *args: self.launch_folder(uri)) + dialog.present() + + if info.on_windows: + self.app.center_win_on_parent(dialog) except Exception as error: logger.exception(error) diff --git a/src/browser/import_lists_window.py b/src/browser/import_lists_window.py index 607bd87..cd4d997 100644 --- a/src/browser/import_lists_window.py +++ b/src/browser/import_lists_window.py @@ -44,6 +44,9 @@ def __init__(self, app, files, *args, **kwargs): self.present() + if info.on_windows: + self.app.center_win_on_parent(self) + def do_save(self): if self.expander.get_enable_expansion(): task_list = self.win.task_list_ids[self.task_list_row.get_selected()] @@ -74,4 +77,8 @@ def on_save(self, button = None): confirm_dialog.set_default_response('cancel') confirm_dialog.set_close_response('cancel') confirm_dialog.connect('response::yes', lambda *args: self.do_save()) + confirm_dialog.present() + + if info.on_windows: + self.app.center_win_on_parent(confirm_dialog) diff --git a/src/browser/main_window.py b/src/browser/main_window.py index 84a2820..1db5027 100644 --- a/src/browser/main_window.py +++ b/src/browser/main_window.py @@ -375,8 +375,11 @@ def selected_changed(self, list_box = None): def new_edit_win(self, reminder = None): if self.reminder_edit_win is None: self.reminder_edit_win = ReminderEditWindow(self, self.app, reminder) - self.reminder_edit_win.present() self.reminder_edit_win.connect('close-request', self.close_edit_win) + self.reminder_edit_win.present() + + if info.on_windows: + self.app.center_win_on_parent(self.reminder_edit_win) else: self.reminder_edit_win.setup(reminder) self.reminder_edit_win.set_visible(True) @@ -394,7 +397,11 @@ def close_edit_win(self, window = None): confirm_dialog.set_default_response('cancel') confirm_dialog.set_close_response('cancel') confirm_dialog.connect('response::yes', lambda *args: self.reminder_edit_win.set_visible(False)) + confirm_dialog.present() + + if info.on_windows: + self.app.center_win_on_parent(confirm_dialog) return True else: self.reminder_edit_win.set_visible(False) @@ -532,7 +539,11 @@ def get_time_label(self, time): def edit_lists(self): if self.edit_lists_window is None: self.edit_lists_window = EditListsWindow(self) + self.edit_lists_window.present() + + if info.on_windows: + self.app.center_win_on_parent(self.edit_lists_window) else: self.edit_lists_window.set_visible(True) @@ -1288,8 +1299,12 @@ def selected_complete(self, btn): confirm_dialog.set_default_response('cancel') confirm_dialog.set_close_response('cancel') confirm_dialog.connect('response::yes', lambda *args: self.selected_change_completed(True)) + confirm_dialog.present() + if info.on_windows: + self.app.center_win_on_parent(confirm_dialog) + @Gtk.Template.Callback() def selected_incomplete(self, btn): confirm_dialog = Adw.MessageDialog( @@ -1303,8 +1318,12 @@ def selected_incomplete(self, btn): confirm_dialog.set_default_response('cancel') confirm_dialog.set_close_response('cancel') confirm_dialog.connect('response::yes', lambda *args: self.selected_change_completed(False)) + confirm_dialog.present() + if info.on_windows: + self.app.center_win_on_parent(confirm_dialog) + @Gtk.Template.Callback() def move_selected(self, btn): MoveRemindersWindow(self, self.reminders_list.get_selected_rows()) @@ -1322,8 +1341,12 @@ def selected_important(self, btn): confirm_dialog.set_default_response('cancel') confirm_dialog.set_close_response('cancel') confirm_dialog.connect('response::yes', lambda *args: self.selected_change_important(True)) + confirm_dialog.present() + if info.on_windows: + self.app.center_win_on_parent(confirm_dialog) + @Gtk.Template.Callback() def selected_unimportant(self, btn): confirm_dialog = Adw.MessageDialog( @@ -1337,8 +1360,12 @@ def selected_unimportant(self, btn): confirm_dialog.set_default_response('cancel') confirm_dialog.set_close_response('cancel') confirm_dialog.connect('response::yes', lambda *args: self.selected_change_important(False)) + confirm_dialog.present() + if info.on_windows: + self.app.center_win_on_parent(confirm_dialog) + @Gtk.Template.Callback() def selected_remove(self, btn = None): confirm_dialog = Adw.MessageDialog( @@ -1352,4 +1379,8 @@ def selected_remove(self, btn = None): confirm_dialog.set_default_response('cancel') confirm_dialog.set_close_response('cancel') confirm_dialog.connect('response::yes', lambda *args: self.selected_remove_reminders()) + confirm_dialog.present() + + if info.on_windows: + self.app.center_win_on_parent(confirm_dialog) diff --git a/src/browser/meson.build b/src/browser/meson.build index 9832ef4..ff2cc9d 100644 --- a/src/browser/meson.build +++ b/src/browser/meson.build @@ -1,7 +1,3 @@ -conf = configuration_data() -conf.set('PYTHON_PATH', python.full_path()) -conf.set('LOCALE_DIR', get_option('prefix') / get_option('localedir')) - source_files = files( '__init__.py', 'about.py', @@ -29,7 +25,7 @@ install_data( configure_file( input: 'reminders.py', - output: app_executable, + output: app_file, configuration: conf, install: true, install_dir: get_option('prefix') / get_option('bindir') diff --git a/src/browser/microsoft_sign_in.py b/src/browser/microsoft_sign_in.py index 58eba0a..a791ca3 100644 --- a/src/browser/microsoft_sign_in.py +++ b/src/browser/microsoft_sign_in.py @@ -13,12 +13,12 @@ # You should have received a copy of the GNU General Public License along with # this program. If not, see . -import gi +from gi import require_version from reminders import info -gi.require_version('WebKit', '6.0') -from gi.repository import Gtk, Adw, WebKit +require_version('WebKit', '6.0') +from gi.repository import Gtk, Adw, WebKit, GLib from logging import getLogger @@ -40,8 +40,7 @@ def __init__(self, preferences, **kwargs): self.web.set_vexpand(True) url = self.app.run_service_method('MSGetLoginURL', None).unpack()[0] - self.app.service.connect('g-signal::MSSignedIn', lambda *args: self.destroy()) - self.web.load_uri(url) self.main.append(self.web) + self.present() diff --git a/src/browser/move_reminders_window.py b/src/browser/move_reminders_window.py index 24d5ddf..5495a70 100644 --- a/src/browser/move_reminders_window.py +++ b/src/browser/move_reminders_window.py @@ -48,6 +48,9 @@ def __init__(self, win, reminders, *args, **kwargs): self.present() + if info.on_windows: + self.win.app.center_win_on_parent(self) + def do_save(self): try: selected = self.lists.get_selected_rows()[0] @@ -114,4 +117,9 @@ def on_save(self, button = None): confirm_dialog.set_default_response('cancel') confirm_dialog.set_close_response('cancel') confirm_dialog.connect('response::yes', lambda *args: self.do_save()) + confirm_dialog.present() + + if info.on_windows: + self.win.app.center_win_on_parent(confirm_dialog) + diff --git a/src/browser/preferences.py b/src/browser/preferences.py index 96535f3..ff2a34e 100644 --- a/src/browser/preferences.py +++ b/src/browser/preferences.py @@ -17,10 +17,13 @@ from reminders import info from reminders.browser.caldav_sign_in import CalDAVSignIn -from reminders.browser.microsoft_sign_in import MicrosoftSignIn + +if not info.on_windows: + from reminders.browser.microsoft_sign_in import MicrosoftSignIn from gi.repository import Gtk, Adw, GLib, Gio, Pango from logging import getLogger +from webbrowser import open_new logger = getLogger(info.app_executable) @@ -157,7 +160,11 @@ def caldav_signed_in(self, user_id, username): @Gtk.Template.Callback() def ms_sign_in(self, row = None): - MicrosoftSignIn(self) + if info.on_windows: + url = self.app.run_service_method('MSGetLoginURL', None).unpack()[0] + open_new(url) + else: + MicrosoftSignIn(self) @Gtk.Template.Callback() def caldav_sign_in(self, row = None): @@ -276,7 +283,13 @@ def sign_out(self, button = None): confirm_dialog.set_default_response('cancel') confirm_dialog.set_response_appearance('logout', Adw.ResponseAppearance.DESTRUCTIVE) confirm_dialog.connect('response::logout', lambda *args: self.preferences.app.win.sign_out(self.user_id)) - confirm_dialog.present() + if info.on_windows: + confirm_dialog.present() + # goofy hack to make sure window is centered + GLib.idle_add(lambda *args: confirm_dialog.set_visible(False)) + GLib.idle_add(lambda *args: confirm_dialog.set_visible(True)) + else: + confirm_dialog.present() except Exception as error: logger.exception(error) diff --git a/src/browser/reminder.py b/src/browser/reminder.py index 137b2a0..8d90a25 100644 --- a/src/browser/reminder.py +++ b/src/browser/reminder.py @@ -416,6 +416,9 @@ def on_remove(self, button): confirm_dialog.connect('response::remove', lambda *args: self.remove()) confirm_dialog.present() + if info.on_windows: + self.app.center_win_on_parent(confirm_dialog) + @Gtk.Template.Callback() def edit(self, button = None): self.win.new_edit_win(self) diff --git a/src/browser/reminders.py b/src/browser/reminders.py index 51eabd4..4ad6881 100755 --- a/src/browser/reminders.py +++ b/src/browser/reminders.py @@ -18,15 +18,41 @@ import gettext import locale -locale_dir = '@LOCALE_DIR@' +from os import path, sep, environ +from gi.repository import Gio + +LOCALE_DIR = '@LOCALE_DIR@' +DATA_DIR = '@DATA_DIR@' + +if getattr(sys, 'frozen', False): + REMINDERS_PATH = path.realpath(path.dirname(sys.executable)) +else: + REMINDERS_PATH = str(path.realpath(path.dirname(__file__))) + +environ['REMINDERS_PATH'] = REMINDERS_PATH if __name__ == '__main__': from reminders import info + + gresource_path = f'{DATA_DIR}{sep}{info.project_name}{sep}{info.project_name}.gresource' + + if not path.isabs(gresource_path): + gresource_path = path.dirname(REMINDERS_PATH) + sep + gresource_path + + if not path.isabs(LOCALE_DIR): + locale_dir = path.dirname(REMINDERS_PATH) + sep + LOCALE_DIR + + resource = Gio.Resource.load(gresource_path) + resource._register() + from reminders.browser.application import main - locale.bindtextdomain(info.app_executable, locale_dir) - locale.textdomain(info.app_executable) - gettext.bindtextdomain(info.app_executable, locale_dir) - gettext.textdomain(info.app_executable) + try: + locale.bindtextdomain(info.project_name, locale_dir) + locale.textdomain(info.project_name) + except: + pass + gettext.bindtextdomain(info.project_name, locale_dir) + gettext.textdomain(info.project_name) sys.exit(main()) diff --git a/src/browser/resources/meson.build b/src/browser/resources/meson.build index c102431..b8dd0ca 100644 --- a/src/browser/resources/meson.build +++ b/src/browser/resources/meson.build @@ -18,10 +18,10 @@ resources = files( ) gnome.compile_resources( - app_executable, + meson.project_name(), 'reminders.gresource.xml', install: true, - install_dir: python.get_install_dir() / meson.project_name() / 'browser', + install_dir: get_option('prefix') / get_option('datadir') / meson.project_name(), dependencies: resources, gresource_bundle: true, ) diff --git a/src/browser/resources/ui/main_window.ui b/src/browser/resources/ui/main_window.ui index e77f4f6..0daea7b 100644 --- a/src/browser/resources/ui/main_window.ui +++ b/src/browser/resources/ui/main_window.ui @@ -94,7 +94,7 @@ true - 240 + 250 diff --git a/src/service/backend.py b/src/service/backend.py index 1e4ec60..324c69e 100644 --- a/src/service/backend.py +++ b/src/service/backend.py @@ -23,6 +23,7 @@ from reminders.service.countdowns import Countdowns from reminders.service.icalendar import iCalendar from reminders.service.reminder import Reminder +from reminders.service.credentials import Credentials if not info.on_windows: from gi import require_version @@ -64,8 +65,6 @@ logger = getLogger(info.service_executable) -environ['KEYRING_PROPERTY_APPID'] = info.app_id - if not path.isdir(info.data_dir) and path.isdir(info.old_data_dir): move(info.old_data_dir, info.data_dir) @@ -83,8 +82,9 @@ def __init__(self, app): self._regid = None self.playing_sound = False self.synced_ids = self.app.settings.get_value('synced-lists').unpack() - self.to_do = MSToDo(self) - self.caldav = CalDAV(self) + self.credentials = Credentials() + self.to_do = MSToDo(self, self.credentials) + self.caldav = CalDAV(self, self.credentials) self.ical = iCalendar(self) self.queue = ReminderQueue(self) self.synced_changed = self.app.settings.connect('changed::synced-lists', lambda *args: self._synced_task_list_changed()) @@ -653,7 +653,10 @@ def show_notification(self, reminder_id): def _unsend_notification(self, reminder_id): if info.on_windows: - self.notif_manager.history.remove(reminder_id) + group = self.reminders[reminder_id]['list-id'] + for i in self.notif_manager.history.get_history(info.app_id): + if reminder_id == i.tag and group == i.group: + self.notif_manager.history.remove(reminder_id, group, info.app_id) else: self.app.withdraw_notification(reminder_id) @@ -700,6 +703,7 @@ def _create_notification_windows(self, reminder_id): xml.load_xml(xml_string) notification = notifications.ToastNotification(xml) notification.tag = reminder_id + notification.group = reminder['list-id'] self.notifier.show(notification) diff --git a/src/service/caldav.py b/src/service/caldav.py index 189f3d6..1c092b3 100644 --- a/src/service/caldav.py +++ b/src/service/caldav.py @@ -23,20 +23,16 @@ from caldav.davclient import DAVClient from caldav.elements.dav import DisplayName from caldav.objects import Todo -from keyring import get_password, set_password, delete_password, set_keyring -from keyring.backends import SecretService DAYS = ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU'] logger = getLogger(info.service_executable) -if not info.on_windows: - set_keyring(SecretService) - class CalDAV(): - def __init__(self, reminders): + def __init__(self, reminders, credentials): self.users = {} self.principals = {} self.reminders = reminders + self.credentials = credentials self.load_users() try: self.get_principals() @@ -61,11 +57,11 @@ def get_principals(self): def store(self): if len(self.users.keys()) > 0: - set_password('caldav', 'users', dumps(self.users)) + self.credentials.add_password('caldav-users', dumps(self.users)) def load_users(self): try: - self.users = loads(get_password('caldav', 'users')) + self.users = loads(self.credentials.lookup_password('caldav-users')) for i, value in self.users.items(): for key in ('name', 'url', 'username', 'password'): if key not in value.keys(): @@ -99,7 +95,10 @@ def logout(self, user_id): pass if self.users == {}: - delete_password('caldav', 'users') + try: + self.credentials.remove_password('caldav-users') + except: + pass else: self.store() diff --git a/src/service/credentials.py b/src/service/credentials.py new file mode 100644 index 0000000..81909e4 --- /dev/null +++ b/src/service/credentials.py @@ -0,0 +1,68 @@ +# credentials.py +# Copyright (C) 2023 Sasha Hale +# +# 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 . + +from reminders import info + +if info.on_windows: + from winsdk.windows.security.credentials import PasswordVault, PasswordCredential +else: + from gi import require_version + require_version('Secret', '1') + from gi.repository import Secret + +class Credentials(): + def __init__(self): + if info.on_windows: + self.vault = PasswordVault() + else: + self.schema = Secret.Schema.new( + info.app_id, + Secret.SchemaFlags.NONE, + { 'name': Secret.SchemaAttributeType.STRING } + ) + + def add_password(self, username, password): + if info.on_windows: + self.vault.add(PasswordCredential(username, username, password)) + else: + Secret.password_store_sync( + self.schema, + { 'name': username }, + None, + username, + password, + None + ) + + def remove_password(self, username): + if info.on_windows: + self.vault.remove(self.vault.retrieve(username, username)) + else: + Secret.password_clear( + self.schema, + { 'name': username }, + None, + None + ) + + def lookup_password(self, username): + if info.on_windows: + return self.vault.retrieve(username, username).password + else: + return Secret.password_lookup_sync( + self.schema, + { 'name': username }, + None + ) diff --git a/src/service/meson.build b/src/service/meson.build index 9de8ad8..f67758f 100644 --- a/src/service/meson.build +++ b/src/service/meson.build @@ -3,6 +3,7 @@ source_files = files( 'backend.py', 'caldav.py', 'countdowns.py', + 'credentials.py', 'icalendar.py', 'application.py', 'ms_to_do.py', diff --git a/src/service/ms_to_do.py b/src/service/ms_to_do.py index eeda341..238dcf6 100644 --- a/src/service/ms_to_do.py +++ b/src/service/ms_to_do.py @@ -27,11 +27,7 @@ from http.server import HTTPServer, BaseHTTPRequestHandler from urllib.parse import parse_qs from threading import Thread -from keyring import get_password, set_password, delete_password, set_keyring -from keyring.backends import SecretService - -if not info.on_windows: - set_keyring(SecretService) +from gettext import gettext as _ GRAPH = 'https://graph.microsoft.com/v1.0' @@ -58,6 +54,9 @@ def do_GET(self): if 'error' not in results: self.callback(results) self.send_response(200) + self.send_header('Content-type', 'text/html') + self.end_headers() + self.wfile.write(bytes(_('Authentication complete. You can close this window now.'), 'UTF-8')) else: self.send_response(301) redirect = self.error_callback() @@ -65,12 +64,13 @@ def do_GET(self): self.end_headers() class MSToDo(): - def __init__(self, reminders): + def __init__(self, reminders, credentials): self.app = None self.flow = None self.tokens = {} self.users = {} self.reminders = reminders + self.credentials = credentials self.cache = SerializableTokenCache() self.flows = {} @@ -151,7 +151,7 @@ def get_tokens(self): except (ConnectionError, HTTPError, Timeout) as error: try: self.users = loads( - get_password('microsoft-users', 'users') + self.credentials.lookup_password('microsoft-users') ) for i, value in self.users.items(): for key in ('email', 'local-id'): @@ -167,13 +167,13 @@ def get_tokens(self): def store(self): if self.app is not None and len(self.users.keys()) > 0: - set_password('microsoft-cache', 'cache', self.cache.serialize()) - set_password('microsoft-users', 'users', dumps(self.users)) + self.credentials.add_password('microsoft-cache', self.cache.serialize()) + self.credentials.add_password('microsoft-users', dumps(self.users)) def read_cache(self): try: self.cache.deserialize( - get_password('microsoft-cache', 'cache') + self.credentials.lookup_password('microsoft-cache') ) except: self.logout_all() @@ -219,11 +219,11 @@ def logout_all(self): self.tokens = {} self.users = {} try: - delete_password('microsoft-cache', 'cache') + self.credentials.remove_password('microsoft-cache') except: pass try: - delete_password('microsoft-users', 'users') + self.credentials.remove_password('microsoft-users') except: pass @@ -248,11 +248,11 @@ def logout(self, user_id): self.users.pop(user_id) if self.users == {}: try: - delete_password('microsoft-cache', 'cache') + self.credentials.remove_password('microsoft-cache') except: pass try: - delete_password('microsoft-users', 'users') + self.credentials.remove_password('microsoft-users') except: pass else: diff --git a/windows/Product.wxs b/windows/Product.wxs index ac85539..8c15822 100644 --- a/windows/Product.wxs +++ b/windows/Product.wxs @@ -31,15 +31,11 @@ - - - + - - - + @@ -52,9 +48,7 @@ - - - + diff --git a/windows/package-msys2.sh b/windows/package-msys2.sh index a97b3a0..b404492 100644 --- a/windows/package-msys2.sh +++ b/windows/package-msys2.sh @@ -36,7 +36,6 @@ pacman --noconfirm -S --needed \ mingw-w64-${ARCH}-python3 \ mingw-w64-${ARCH}-python3-gobject \ mingw-w64-${ARCH}-python-cryptography \ - mingw-w64-${ARCH}-python-keyring \ mingw-w64-${ARCH}-python-lxml \ mingw-w64-${ARCH}-python-markupsafe \ mingw-w64-${ARCH}-python-pip \ @@ -93,8 +92,6 @@ cp -rf /${PREFIX}/tmp/out/Reminders/certifi bin cp -rf /${PREFIX}/tmp/out/Reminders/cryptography* bin cp -rf /${PREFIX}/tmp/out/Reminders/gi bin cp -rf /${PREFIX}/tmp/out/Reminders/gi_typelibs bin -cp -rf /${PREFIX}/tmp/out/Reminders/importlib* bin -cp -rf /${PREFIX}/tmp/out/Reminders/keyring* bin cp -rf /${PREFIX}/tmp/out/Reminders/lib-dynload bin cp -rf /${PREFIX}/tmp/out/Reminders/lxml bin cp -rf /${PREFIX}/tmp/out/Reminders/pytz bin From 533d1a77946f6eb83755d9934f504c8afe20a639 Mon Sep 17 00:00:00 2001 From: dgsasha Date: Sat, 13 May 2023 21:25:10 -0400 Subject: [PATCH 3/6] Fix windows toasts, add windows CI, improve file picker --- .github/workflows/flatpak_builder.yml | 14 +- .github/workflows/release.yml | 29 ++ .github/workflows/windows.yml | 28 + .gitignore | 2 + README.md | 4 +- REMINDERS_SERVICE.md | 13 +- ...remindersdevs.Reminders.metainfo.xml.in.in | 9 +- ...hub.remindersdevs.Reminders.Service.xml.in | 2 +- ...o.github.remindersdevs.Reminders.Devel.yml | 57 +++ flatpak/io.github.remindersdevs.Reminders.yml | 5 +- po/POTFILES | 1 + po/{remembrance.pot => reminders.pot} | 481 +++++------------- po/update_potfile.ps1 | 35 ++ po/update_potfile.sh | 7 +- po/update_potfile_msys.sh | 26 + src/browser/about.py | 3 +- src/browser/application.py | 84 +-- src/browser/export_lists_window.py | 9 +- src/browser/main_window.py | 16 +- src/browser/preferences.py | 13 +- src/browser/reminder_edit_window.py | 6 +- src/browser/reminders.py | 1 + src/browser/resources/ui/preferences.ui | 15 +- src/service/application.py | 66 +-- src/service/backend.py | 14 +- src/service/icalendar.py | 9 +- windows/Product.wxs | 179 ++++--- windows/Reminders.wixproj | 14 +- windows/build_windows.ps1 | 9 +- windows/package-msys2.sh | 1 - windows/settings.ini | 1 - 31 files changed, 548 insertions(+), 605 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/windows.yml create mode 100644 flatpak/io.github.remindersdevs.Reminders.Devel.yml rename po/{remembrance.pot => reminders.pot} (62%) create mode 100644 po/update_potfile.ps1 create mode 100644 po/update_potfile_msys.sh diff --git a/.github/workflows/flatpak_builder.yml b/.github/workflows/flatpak_builder.yml index 405c234..99f03de 100644 --- a/.github/workflows/flatpak_builder.yml +++ b/.github/workflows/flatpak_builder.yml @@ -1,11 +1,17 @@ on: push: - branches: [main] + branches: + - main + paths: + - 'src/**' + - 'data/**' + - 'flatpak/**' + - 'meson.build' pull_request: -name: CI + +name: Flatpak jobs: flatpak: - name: "Flatpak" runs-on: ubuntu-latest container: image: bilelmoussaoui/flatpak-github-actions:gnome-44 @@ -15,5 +21,5 @@ jobs: - uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v6.1 with: bundle: Reminders.flatpak - manifest-path: flatpak/io.github.remindersdevs.Reminders.yml + manifest-path: flatpak/io.github.remindersdevs.Reminders.Devel.yml cache-key: flatpak-builder-${{ github.sha }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..2c59e1e --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,29 @@ +on: + push: + tags: + - '*' + +name: Release +jobs: + windows: + name: Windows + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + - uses: msys2/setup-msys2@v2 + with: + update: true + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: + 7.x + - name: Build + run: | + dotnet tool install --global wix --version 4.0.0 + windows/build_windows.ps1 -arches x86, x64 -msi -release + - uses: actions/upload-artifact@v3 + with: + name: Reminders Installer + path: | + out/x64/Release/en-us/Reminders Installer x64.msi + out/x86/Release/en-us/Reminders Installer x86.msi diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000..dfbbee2 --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,28 @@ +on: + push: + branches: + - main + paths: + - 'src/**' + - 'data/**' + - 'windows/**' + - 'meson.build' + pull_request: + +name: Windows +jobs: + windows: + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + - uses: msys2/setup-msys2@v2 + with: + update: true + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: + 7.x + - name: Build + run: | + dotnet tool install --global wix --version 4.0.0 + windows/build_windows.ps1 -msi diff --git a/.gitignore b/.gitignore index f131d7c..78ffe76 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ build build-dir .flatpak-builder +bin out obj +.vs diff --git a/README.md b/README.md index 142b0e4..2e54189 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ You will also need `flatpak-builder` ### Building (Flatpak): ``` -flatpak-builder --user --install --force-clean build-dir flatpak/io.github.remindersdevs.Reminders.yml +flatpak-builder --user --install --force-clean build-dir flatpak/io.github.remindersdevs.Reminders.Devel.yml ``` ``` flatpak run io.github.remindersdevs.Reminders.Devel --restart-service @@ -66,7 +66,7 @@ MSYS2 will be used to build the app in a unix environment (Arch based), and all ``` Usage: build_windows.ps1 [options...] Options: - -arches Can be x86, x64, or arm64. Comma separated list, default is amd64. + -arches Can be x86, x64, or arm64. Comma separated list, default is x64. -root MSYS2 root path, default is 'C:\msys64'. -msi Build an msi installer -help Display this message. diff --git a/REMINDERS_SERVICE.md b/REMINDERS_SERVICE.md index 7493985..3613e42 100644 --- a/REMINDERS_SERVICE.md +++ b/REMINDERS_SERVICE.md @@ -330,22 +330,21 @@ Log out of a remote account, once logged out the reminders will be refreshed - Type: s ### ExportLists -Export lists to ical/ics file +Export lists to ical/ics file, you shouldn't use this because of flatpak sandboxing limitations - Parameters (as) + - folder + - Type: s + - The folder you want to export to - list-ids - Type: as - An array of list ids that represent the lists to export -- Returns (s) - - folder - - Type: s - ### ImportLists -Import lists from an ical/ics file +Import lists from an ical/ics file, you shouldn't use this because of flatpak sandboxing limitations - Parameters (ass) - ical-files - Type: as - - An array of files ids to import + - An array of files to import - list-id - Type: s - The list to import the files to, or 'auto' if you want to create new lists diff --git a/data/io.github.remindersdevs.Reminders.metainfo.xml.in.in b/data/io.github.remindersdevs.Reminders.metainfo.xml.in.in index 930172f..1c38d30 100644 --- a/data/io.github.remindersdevs.Reminders.metainfo.xml.in.in +++ b/data/io.github.remindersdevs.Reminders.metainfo.xml.in.in @@ -6,10 +6,10 @@ Reminders Developers dgsasha04_at_gmail.com - Reminders - Set reminders and manage tasks + Reminders + Set reminders and manage tasks - +

What you can do with Reminders:

  • Set recurring reminders
  • @@ -80,10 +80,11 @@ https://hosted.weblate.org/engage/reminders https://github.com/dgsasha/remembrance https://github.com/dgsasha/remembrance/issues - +
      +
    • Windows port
    • UI improvements
    • Added support for making the week start on sunday
    • Added indicators that show how many incomplete reminders are in each list/group
    • diff --git a/data/service/io.github.remindersdevs.Reminders.Service.xml.in b/data/service/io.github.remindersdevs.Reminders.Service.xml.in index b9f2b96..b832c52 100644 --- a/data/service/io.github.remindersdevs.Reminders.Service.xml.in +++ b/data/service/io.github.remindersdevs.Reminders.Service.xml.in @@ -118,8 +118,8 @@ + - diff --git a/flatpak/io.github.remindersdevs.Reminders.Devel.yml b/flatpak/io.github.remindersdevs.Reminders.Devel.yml new file mode 100644 index 0000000..d398e05 --- /dev/null +++ b/flatpak/io.github.remindersdevs.Reminders.Devel.yml @@ -0,0 +1,57 @@ +app-id: io.github.remindersdevs.Reminders.Devel +runtime: org.gnome.Platform +runtime-version: '44' +sdk: org.gnome.Sdk +command: reminders + +finish-args: + - --share=network + - --share=ipc + - --device=dri + - --socket=wayland + - --socket=fallback-x11 + - --system-talk-name=org.freedesktop.login1 + - --talk-name=org.freedesktop.secrets + - --socket=pulseaudio + - --filesystem=xdg-download + +modules: + - shared-modules/intltool/intltool-0.51.json + - shared-modules/libcanberra/libcanberra.json + - python3-modules.json + + - name: libportal + buildsystem: meson + config-opts: + - -Ddocs=false + - -Dbackends=gtk4 + sources: + - type: archive + url: https://github.com/flatpak/libportal/archive/refs/tags/0.6.tar.gz + sha256: 8ad326c4f53b7433645dc86d994fef0292bee8adda0fe67db9288ace19250a9c + + - name: gsound + buildsystem: meson + config-opts: + - -Denable_vala=false + sources: + - type: archive + url: https://gitlab.gnome.org/GNOME/gsound/-/archive/1.0.3/gsound-1.0.3.tar.gz + sha256: ebee33c77f43bcae87406c20e051acaff08e86f8960c35b92911e243fddc7a0b + + - name: sound-theme-freedesktop + sources: + - type: archive + url: http://people.freedesktop.org/~mccann/dist/sound-theme-freedesktop-0.8.tar.bz2 + sha256: cb518b20eef05ec2e82dda1fa89a292c1760dc023aba91b8aa69bafac85e8a14 + + - name: reminders + builddir: true + buildsystem: meson + config-opts: + - -Denable-portals=true + - -Drelease-type=devel + sources: + - type: dir + path: '../' + diff --git a/flatpak/io.github.remindersdevs.Reminders.yml b/flatpak/io.github.remindersdevs.Reminders.yml index d398e05..35711f3 100644 --- a/flatpak/io.github.remindersdevs.Reminders.yml +++ b/flatpak/io.github.remindersdevs.Reminders.yml @@ -1,4 +1,4 @@ -app-id: io.github.remindersdevs.Reminders.Devel +app-id: io.github.remindersdevs.Reminders runtime: org.gnome.Platform runtime-version: '44' sdk: org.gnome.Sdk @@ -13,7 +13,6 @@ finish-args: - --system-talk-name=org.freedesktop.login1 - --talk-name=org.freedesktop.secrets - --socket=pulseaudio - - --filesystem=xdg-download modules: - shared-modules/intltool/intltool-0.51.json @@ -50,7 +49,7 @@ modules: buildsystem: meson config-opts: - -Denable-portals=true - - -Drelease-type=devel + - -Drelease-type=stable sources: - type: dir path: '../' diff --git a/po/POTFILES b/po/POTFILES index be734f7..1ce0f7d 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -27,3 +27,4 @@ src/browser/reminder.py src/browser/reminder_edit_window.py src/info.py src/service/backend.py +src/service/ms_to_do.py diff --git a/po/remembrance.pot b/po/reminders.pot similarity index 62% rename from po/remembrance.pot rename to po/reminders.pot index 87fcb05..b9b545e 100644 --- a/po/remembrance.pot +++ b/po/reminders.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the remembrance package. +# This file is distributed under the same license as the reminders package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: remembrance\n" +"Project-Id-Version: reminders\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-05-03 14:51-0400\n" +"POT-Creation-Date: 2023-05-14 15:32-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,8 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: data/browser/io.github.remindersdevs.Reminders.desktop.in.in:4 -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:9 -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:66 src/info.py:8 +#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:9 src/info.py:11 msgid "Reminders" msgstr "" @@ -35,7 +34,11 @@ msgid "" msgstr "" #: data/service/io.github.remindersdevs.Reminders.Service.desktop.in.in:4 -msgid "Remembrance Service" +msgid "Reminders Service" +msgstr "" + +#: data/service/io.github.remindersdevs.Reminders.Service.desktop.in.in:5 +msgid "DBus service for managing reminders and tasks" msgstr "" #: data/io.github.remindersdevs.Reminders.gschema.xml.in:23 @@ -133,7 +136,7 @@ msgid "(user_id, task_id) ids can be 'all', 'local', or an actual id" msgstr "" #: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:6 -#: src/browser/about.py:50 +#: src/browser/about.py:51 msgid "Reminders Developers" msgstr "" @@ -177,244 +180,6 @@ msgstr "" msgid "Import and export ical/ics files" msgstr "" -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:57 -msgid "Todo" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:58 -msgid "Productivity" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:59 -msgid "Task" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:60 -msgid "Planning" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:61 -msgid "Planner" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:62 -#: src/browser/resources/ui/reminder_edit_window.ui:87 -msgid "Time" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:63 -msgid "Management" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:64 -msgid "Reminder" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:65 -msgid "Remembrance" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:87 -msgid "UI improvements" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:88 -msgid "Added support for making the week start on sunday" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:89 -msgid "" -"Added indicators that show how many incomplete reminders are in each list/" -"group" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:90 -msgid "Added support for syncing with CalDAV servers" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:91 -msgid "" -"Added support for selecting multiple reminders in one click by holding shift" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:92 -msgid "Added support for dragging and dropping reminders between lists" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:93 -msgid "Added support for importing and exporting ical/ics files" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:94 -msgid "Added more multithreading to significantly speed up certain operations" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:95 -msgid "Added support for syncing recurring reminders with Microsoft To Do" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:96 -msgid "Added support for creating monthly and yearly repeating reminders" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:97 -msgid "" -"Version numbers are now handled in a logical way (as in they aren't just " -"doubles)" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:98 -msgid "" -"Microsoft sign in window now appears in the app instead of in the browser" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:99 -msgid "Significantly improve how recurring reminders function" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:100 -msgid "Fix date/time text wrapping awkwardly" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:101 -msgid "Improvements to handling of network errors" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:102 -msgid "Fix some other minor issues" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:103 -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:207 -msgid "Bump API version" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:110 -msgid "Fix versioning by bumping to 4.0" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:117 -msgid "Remove warning about cloud syncing being in beta" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:118 -msgid "Fix issue where you could make reminder recurring when it shouldn't be" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:125 -msgid "Change delete icon" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:126 -msgid "Fix some ui bugs" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:127 -msgid "Some tiny performance improvements" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:128 -msgid "Improve logging" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:135 -msgid "UI Improvements to sidebar" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:136 -msgid "Fix issues when moving reminders between lists" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:137 -msgid "Fix issue with error dialogs" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:144 -msgid "Fix issue when deleting lists" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:151 -msgid "Fix issue when removing selected reminders" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:158 -msgid "Performance improvements" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:159 -msgid "Don't freeze UI when updating MS reminders" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:160 -msgid "Automatically refresh reminders after waking from suspend" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:161 -msgid "Fix issues with deleting lists" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:162 -msgid "Fix issues when queueing remote changes while internet is disconnected" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:169 -msgid "Stop showing completed reminders on upcoming page" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:170 -msgid "Cross out completed reminders on all reminders page" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:177 -msgid "Add support for setting due dates without sending notifications" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:178 -msgid "" -"Add support for selecting and editing multiple reminders (Start selecting " -"with Ctrl + LMB or by pressing and holding a reminder)" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:179 -msgid "Slightly improve error handling" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:186 -msgid "Fix issue when setting reminders in another year" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:193 -msgid "Fix issue when saving Microsoft To Do Reminders" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:200 -msgid "New notification sound" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:201 -msgid "Allow sorting reminders by created time and last updated time" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:202 -msgid "Allow marking reminders as important" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:203 -msgid "Slightly improved UI" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:204 -msgid "Added keyboard shortcuts page" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:205 -msgid "Added more keyboard shortcuts" -msgstr "" - -#: data/io.github.remindersdevs.Reminders.metainfo.xml.in.in:206 -msgid "Lots of bugfixes" -msgstr "" - #: src/browser/resources/ui/caldav_sign_in.ui:23 msgid "CalDAV Sync" msgstr "" @@ -441,7 +206,7 @@ msgid "Sign In" msgstr "" #: src/browser/resources/ui/edit_lists_window.ui:20 -#: src/browser/resources/ui/main_window.ui:285 +#: src/browser/resources/ui/main_window.ui:289 msgid "Edit Lists" msgstr "" @@ -455,14 +220,14 @@ msgstr "" #: src/browser/resources/ui/export_lists_window.ui:78 #: src/browser/resources/ui/import_lists_window.ui:92 -#: src/browser/resources/ui/main_window.ui:426 +#: src/browser/resources/ui/main_window.ui:429 #: src/browser/resources/ui/move_reminders_window.ui:78 #: src/browser/resources/ui/reminder_edit_window.ui:490 -#: src/browser/edit_lists_window.py:96 src/browser/edit_lists_window.py:201 -#: src/browser/main_window.py:391 src/browser/main_window.py:1285 -#: src/browser/main_window.py:1300 src/browser/main_window.py:1319 -#: src/browser/main_window.py:1334 src/browser/main_window.py:1349 -#: src/browser/move_reminders_window.py:111 src/browser/preferences.py:274 +#: src/browser/edit_lists_window.py:100 src/browser/edit_lists_window.py:209 +#: src/browser/main_window.py:394 src/browser/main_window.py:1304 +#: src/browser/main_window.py:1323 src/browser/main_window.py:1346 +#: src/browser/main_window.py:1365 src/browser/main_window.py:1384 +#: src/browser/move_reminders_window.py:114 src/browser/preferences.py:294 #: src/browser/reminder.py:412 msgid "Cancel" msgstr "" @@ -511,96 +276,96 @@ msgid "App menu" msgstr "" #: src/browser/resources/ui/main_window.ui:126 -#: src/browser/resources/ui/main_window.ui:340 src/browser/main_window.py:1048 +#: src/browser/resources/ui/main_window.ui:343 src/browser/main_window.py:1067 msgid "All Reminders" msgstr "" -#: src/browser/resources/ui/main_window.ui:158 src/browser/main_window.py:1059 +#: src/browser/resources/ui/main_window.ui:159 src/browser/main_window.py:1078 msgid "Upcoming Reminders" msgstr "" -#: src/browser/resources/ui/main_window.ui:190 src/browser/main_window.py:1070 +#: src/browser/resources/ui/main_window.ui:192 src/browser/main_window.py:1089 msgid "Past Reminders" msgstr "" -#: src/browser/resources/ui/main_window.ui:222 src/browser/main_window.py:1081 +#: src/browser/resources/ui/main_window.ui:225 src/browser/main_window.py:1100 msgid "Completed Reminders" msgstr "" -#: src/browser/resources/ui/main_window.ui:448 src/browser/reminder.py:346 +#: src/browser/resources/ui/main_window.ui:451 src/browser/reminder.py:346 msgid "Complete" msgstr "" -#: src/browser/resources/ui/main_window.ui:474 src/browser/reminder.py:342 +#: src/browser/resources/ui/main_window.ui:477 src/browser/reminder.py:342 msgid "Incomplete" msgstr "" -#: src/browser/resources/ui/main_window.ui:500 +#: src/browser/resources/ui/main_window.ui:503 #: src/browser/resources/ui/reminder_edit_window.ui:66 msgid "Important" msgstr "" -#: src/browser/resources/ui/main_window.ui:526 +#: src/browser/resources/ui/main_window.ui:529 msgid "Unimportant" msgstr "" -#: src/browser/resources/ui/main_window.ui:551 +#: src/browser/resources/ui/main_window.ui:554 #: src/browser/resources/ui/move_reminders_window.ui:93 msgid "Move" msgstr "" -#: src/browser/resources/ui/main_window.ui:573 +#: src/browser/resources/ui/main_window.ui:576 #: src/browser/resources/ui/reminder.ui:100 -#: src/browser/edit_lists_window.py:202 src/browser/reminder.py:413 +#: src/browser/edit_lists_window.py:210 src/browser/reminder.py:413 msgid "Remove" msgstr "" -#: src/browser/resources/ui/main_window.ui:595 -#: src/browser/resources/ui/main_window.ui:603 +#: src/browser/resources/ui/main_window.ui:598 +#: src/browser/resources/ui/main_window.ui:606 msgid "Add a reminder" msgstr "" -#: src/browser/resources/ui/main_window.ui:625 +#: src/browser/resources/ui/main_window.ui:628 msgid "_Refresh" msgstr "" -#: src/browser/resources/ui/main_window.ui:629 +#: src/browser/resources/ui/main_window.ui:632 msgid "_Export Lists" msgstr "" -#: src/browser/resources/ui/main_window.ui:633 +#: src/browser/resources/ui/main_window.ui:636 msgid "_Import Lists" msgstr "" -#: src/browser/resources/ui/main_window.ui:639 +#: src/browser/resources/ui/main_window.ui:642 msgid "_Preferences" msgstr "" -#: src/browser/resources/ui/main_window.ui:643 +#: src/browser/resources/ui/main_window.ui:646 msgid "_Keyboard Shortcuts" msgstr "" -#: src/browser/resources/ui/main_window.ui:647 +#: src/browser/resources/ui/main_window.ui:650 msgid "_About Reminders" msgstr "" -#: src/browser/resources/ui/main_window.ui:654 +#: src/browser/resources/ui/main_window.ui:657 msgid "Sort By" msgstr "" -#: src/browser/resources/ui/main_window.ui:656 +#: src/browser/resources/ui/main_window.ui:659 msgid "_Time" msgstr "" -#: src/browser/resources/ui/main_window.ui:661 +#: src/browser/resources/ui/main_window.ui:664 msgid "_Alphabetical" msgstr "" -#: src/browser/resources/ui/main_window.ui:666 +#: src/browser/resources/ui/main_window.ui:669 msgid "_Created" msgstr "" -#: src/browser/resources/ui/main_window.ui:671 +#: src/browser/resources/ui/main_window.ui:674 msgid "_Last Updated" msgstr "" @@ -648,6 +413,7 @@ msgid "Week starts on Sunday" msgstr "" #: src/browser/resources/ui/preferences.ui:130 +#: src/browser/resources/ui/preferences.ui:148 msgid "Play sound with notification" msgstr "" @@ -659,31 +425,31 @@ msgstr "" msgid "Otherwise the bell sound from the enabled sound theme will be used" msgstr "" -#: src/browser/resources/ui/preferences.ui:153 +#: src/browser/resources/ui/preferences.ui:164 msgid "Use locale default" msgstr "" -#: src/browser/resources/ui/preferences.ui:154 +#: src/browser/resources/ui/preferences.ui:165 msgid "12 hour time" msgstr "" -#: src/browser/resources/ui/preferences.ui:155 +#: src/browser/resources/ui/preferences.ui:166 msgid "24 hour time" msgstr "" -#: src/browser/resources/ui/preferences.ui:160 +#: src/browser/resources/ui/preferences.ui:171 msgid "5 mins" msgstr "" -#: src/browser/resources/ui/preferences.ui:161 +#: src/browser/resources/ui/preferences.ui:172 msgid "15 mins" msgstr "" -#: src/browser/resources/ui/preferences.ui:162 +#: src/browser/resources/ui/preferences.ui:173 msgid "30 mins" msgstr "" -#: src/browser/resources/ui/preferences.ui:163 +#: src/browser/resources/ui/preferences.ui:174 msgid "60 mins" msgstr "" @@ -692,7 +458,7 @@ msgid "All" msgstr "" #: src/browser/resources/ui/preferences_user_row.ui:75 -#: src/browser/preferences.py:275 +#: src/browser/preferences.py:295 msgid "Sign Out" msgstr "" @@ -716,6 +482,10 @@ msgstr "" msgid "Location" msgstr "" +#: src/browser/resources/ui/reminder_edit_window.ui:87 +msgid "Time" +msgstr "" + #: src/browser/resources/ui/reminder_edit_window.ui:90 msgid "Set a date/time" msgstr "" @@ -930,74 +700,77 @@ msgstr "" msgid "Save changes" msgstr "" -#: src/browser/about.py:51 +#: src/browser/about.py:52 msgid "Copyright 2023 Reminders Developers" msgstr "" +#: src/browser/about.py:58 +#, python-brace-format +msgid "" +"You can find application logs at {info.app_log} and {info.service_log}, " +"submit these with your bug report." +msgstr "" + #. Translators: Do not translate this, instead put your name and email here. #. name -#: src/browser/about.py:59 +#: src/browser/about.py:61 msgid "translator-credits" msgstr "" -#: src/browser/application.py:56 +#: src/browser/application.py:71 msgid "Print the version of the app" msgstr "" -#: src/browser/application.py:63 +#: src/browser/application.py:78 msgid "Restart service before starting app" msgstr "" -#: src/browser/application.py:70 -msgid "Start on a different page" -msgstr "" - -#: src/browser/application.py:195 src/browser/application.py:375 +#: src/browser/application.py:222 src/browser/application.py:441 msgid "Something went wrong" msgstr "" -#: src/browser/application.py:195 src/browser/application.py:375 +#: src/browser/application.py:222 src/browser/application.py:441 msgid "Changes were not saved. This bug should be reported." msgstr "" -#: src/browser/application.py:367 +#: src/browser/application.py:433 msgid "Reminders failed to start" msgstr "" -#: src/browser/application.py:367 +#: src/browser/application.py:433 msgid "" "If this is your first time running Reminders, you will probably have to log " "out and log back in before using it. This is due to a bug in Flatpak." msgstr "" -#: src/browser/edit_lists_window.py:22 src/browser/edit_lists_window.py:118 +#: src/browser/edit_lists_window.py:22 src/browser/edit_lists_window.py:126 msgid "New List" msgstr "" -#: src/browser/edit_lists_window.py:93 src/browser/main_window.py:388 +#: src/browser/edit_lists_window.py:97 src/browser/main_window.py:391 msgid "You have unsaved changes" msgstr "" -#: src/browser/edit_lists_window.py:94 src/browser/main_window.py:389 +#: src/browser/edit_lists_window.py:98 src/browser/main_window.py:392 msgid "Are you sure you want to close the window?" msgstr "" -#: src/browser/edit_lists_window.py:97 src/browser/main_window.py:392 -#: src/browser/main_window.py:1286 src/browser/main_window.py:1301 -#: src/browser/main_window.py:1320 src/browser/main_window.py:1335 -#: src/browser/main_window.py:1350 src/browser/move_reminders_window.py:112 +#: src/browser/edit_lists_window.py:101 src/browser/main_window.py:395 +#: src/browser/main_window.py:1305 src/browser/main_window.py:1324 +#: src/browser/main_window.py:1347 src/browser/main_window.py:1366 +#: src/browser/main_window.py:1385 src/browser/move_reminders_window.py:115 msgid "Yes" msgstr "" -#: src/browser/edit_lists_window.py:153 +#: src/browser/edit_lists_window.py:161 msgid "What should the list be called?" msgstr "" -#: src/browser/edit_lists_window.py:197 +#: src/browser/edit_lists_window.py:205 msgid "Remove list?" msgstr "" -#: src/browser/edit_lists_window.py:198 +#: src/browser/edit_lists_window.py:206 #, python-brace-format msgid "This will remove {list_name} and cannot be undone." msgstr "" @@ -1014,195 +787,195 @@ msgstr "" msgid "No reminders match your search" msgstr "" -#: src/browser/main_window.py:407 +#: src/browser/main_window.py:422 msgid "Does not repeat" msgstr "" -#: src/browser/main_window.py:410 +#: src/browser/main_window.py:425 msgid "minute" msgstr "" -#: src/browser/main_window.py:412 +#: src/browser/main_window.py:427 msgid "minutes" msgstr "" -#: src/browser/main_window.py:415 +#: src/browser/main_window.py:430 msgid "hour" msgstr "" -#: src/browser/main_window.py:417 +#: src/browser/main_window.py:432 msgid "hours" msgstr "" -#: src/browser/main_window.py:420 +#: src/browser/main_window.py:435 msgid "day" msgstr "" -#: src/browser/main_window.py:422 +#: src/browser/main_window.py:437 msgid "days" msgstr "" #. Translators: This is an abbreviation for Monday -#: src/browser/main_window.py:427 +#: src/browser/main_window.py:442 msgid "M" msgstr "" #. Translators: This is an abbreviation for Tuesday -#: src/browser/main_window.py:429 +#: src/browser/main_window.py:444 msgid "Tu" msgstr "" #. Translators: This is an abbreviation for Wednesday -#: src/browser/main_window.py:431 +#: src/browser/main_window.py:446 msgid "W" msgstr "" #. Translators: This is an abbreviation for Thursday -#: src/browser/main_window.py:433 +#: src/browser/main_window.py:448 msgid "Th" msgstr "" #. Translators: This is an abbreviation for Friday -#: src/browser/main_window.py:435 +#: src/browser/main_window.py:450 msgid "F" msgstr "" #. Translators: This is an abbreviation for Saturday -#: src/browser/main_window.py:437 +#: src/browser/main_window.py:452 msgid "Sa" msgstr "" #. Translators: This is an abbreviation for Sunday -#: src/browser/main_window.py:439 +#: src/browser/main_window.py:454 msgid "Su" msgstr "" -#: src/browser/main_window.py:445 +#: src/browser/main_window.py:460 msgid "week" msgstr "" -#: src/browser/main_window.py:447 +#: src/browser/main_window.py:462 msgid "weeks" msgstr "" -#: src/browser/main_window.py:453 +#: src/browser/main_window.py:468 msgid "month" msgstr "" -#: src/browser/main_window.py:455 +#: src/browser/main_window.py:470 msgid "months" msgstr "" -#: src/browser/main_window.py:458 +#: src/browser/main_window.py:473 msgid "year" msgstr "" -#: src/browser/main_window.py:460 +#: src/browser/main_window.py:475 msgid "years" msgstr "" -#: src/browser/main_window.py:463 +#: src/browser/main_window.py:478 msgid "until" msgstr "" #. Translators: This is a noun, preceded by a number to represent the number of occurrences of something -#: src/browser/main_window.py:466 +#: src/browser/main_window.py:481 msgid "time" msgstr "" #. Translators: This is a noun, preceded by a number to represent the number of occurrences of something -#: src/browser/main_window.py:469 +#: src/browser/main_window.py:484 msgid "times" msgstr "" #. Translators: This is a adjective, followed by a number to represent how often something occurs -#: src/browser/main_window.py:474 +#: src/browser/main_window.py:489 msgid "Every" msgstr "" -#: src/browser/main_window.py:510 +#: src/browser/main_window.py:525 msgid "Today" msgstr "" -#: src/browser/main_window.py:512 +#: src/browser/main_window.py:527 msgid "Tomorrow" msgstr "" -#: src/browser/main_window.py:514 +#: src/browser/main_window.py:529 msgid "Yesterday" msgstr "" -#: src/browser/main_window.py:736 +#: src/browser/main_window.py:755 msgid "All Lists" msgstr "" -#: src/browser/main_window.py:1257 +#: src/browser/main_window.py:1276 #, python-brace-format msgid "Searching '{text}'" msgstr "" -#: src/browser/main_window.py:1264 +#: src/browser/main_window.py:1283 msgid "Start typing to search" msgstr "" -#: src/browser/main_window.py:1282 +#: src/browser/main_window.py:1301 msgid "Mark reminders as complete?" msgstr "" -#: src/browser/main_window.py:1283 +#: src/browser/main_window.py:1302 msgid "" "Are you sure you want to mark the currently selected reminder(s) as complete?" msgstr "" -#: src/browser/main_window.py:1297 +#: src/browser/main_window.py:1320 msgid "Mark reminders as incomplete?" msgstr "" -#: src/browser/main_window.py:1298 +#: src/browser/main_window.py:1321 msgid "" "Are you sure you want to mark the currently selected reminder(s) as " "incomplete?" msgstr "" -#: src/browser/main_window.py:1316 +#: src/browser/main_window.py:1343 msgid "Mark reminders as important?" msgstr "" -#: src/browser/main_window.py:1317 +#: src/browser/main_window.py:1344 msgid "" "Are you sure you want to mark the currently selected reminder(s) as " "important?" msgstr "" -#: src/browser/main_window.py:1331 +#: src/browser/main_window.py:1362 msgid "Mark reminders as unimportant?" msgstr "" -#: src/browser/main_window.py:1332 +#: src/browser/main_window.py:1363 msgid "" "Are you sure you want to mark the currently selected reminder(s) as " "unimportant?" msgstr "" -#: src/browser/main_window.py:1346 +#: src/browser/main_window.py:1381 msgid "Remove reminders?" msgstr "" -#: src/browser/main_window.py:1347 +#: src/browser/main_window.py:1382 msgid "" "Are you sure you want to remove the currently selected reminder(s)? This " "cannot be undone." msgstr "" -#: src/browser/move_reminders_window.py:109 +#: src/browser/move_reminders_window.py:112 msgid "Are you sure you want to move the currently selected reminder(s)?" msgstr "" -#: src/browser/preferences.py:270 +#: src/browser/preferences.py:290 msgid "Are you sure you want to sign out?" msgstr "" -#: src/browser/preferences.py:271 +#: src/browser/preferences.py:291 #, python-brace-format msgid "This will sign out {self.username}" msgstr "" @@ -1234,14 +1007,18 @@ msgstr "" msgid "AM" msgstr "" -#: src/service/backend.py:638 +#: src/service/backend.py:61 msgid "Mark as completed" msgstr "" -#: src/service/backend.py:1019 +#: src/service/backend.py:1078 msgid "Local Reminders" msgstr "" -#: src/service/backend.py:1680 +#: src/service/backend.py:1739 msgid "Local" msgstr "" + +#: src/service/ms_to_do.py:59 +msgid "Authentication complete. You can close this window now." +msgstr "" diff --git a/po/update_potfile.ps1 b/po/update_potfile.ps1 new file mode 100644 index 0000000..5af24cc --- /dev/null +++ b/po/update_potfile.ps1 @@ -0,0 +1,35 @@ + +param ( + [string]$arch = 'x64', + [string]$root = 'C:\msys64', + [switch]$help +) + +$SCRIPT_PATH = $PSScriptRoot.replace('\', '/') + +if ($help) { + write-host 'Usage: update_potfile.ps1 [options...]' + write-host 'Options:' + write-host " -arches Can be x86, x64, or arm64." + write-host " -root MSYS2 root path, default is 'C:\msys64'." + write-host " -help Display this message." + exit +} + +if ($root -match '[a-zA-Z]:(\/|\\).*') { + $root = $root.TrimEnd('\', '/') +} else { + throw 'Invalid root path' +} + +if ($arch -eq 'x86') { + $msystem = 'mingw32' +} elseif ($arch -eq 'x64') { + $msystem = 'mingw64' +} elseif ($arch -eq 'arm64') { + $msystem = 'clangarm64' +} else { + throw 'Invalid arch' +} + +& ${root}\msys2_shell.cmd -defterm -here -no-start -shell bash -${msystem} -lc "${SCRIPT_PATH}/update_potfile_msys.sh" diff --git a/po/update_potfile.sh b/po/update_potfile.sh index 988b440..d65340e 100755 --- a/po/update_potfile.sh +++ b/po/update_potfile.sh @@ -1,8 +1,7 @@ #!/usr/bin/env bash -dir=$(dirname "$(realpath "$0")") +=$(dirname "$(realpath "$0")") -cd "${dir}" -cd '../' +cd "${dir}/../" -xgettext -f "${dir}/POTFILES" -o "${dir}/remembrance.pot" --keyword=_ --add-comments=Translators --from-code=UTF-8 --package-name="remembrance" +xgettext -f "${dir}/POTFILES" -o "${dir}/reminders.pot" --keyword=_ --add-comments=Translators --from-code=UTF-8 --package-name=reminders diff --git a/po/update_potfile_msys.sh b/po/update_potfile_msys.sh new file mode 100644 index 0000000..d345bac --- /dev/null +++ b/po/update_potfile_msys.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +set -e +set -x + +SCRIPT_DIR=$(dirname $(realpath -s $0)) + +if [[ "$MSYSTEM" == "MINGW32" ]]; then + ARCH="i686" + PREFIX="mingw32" +elif [[ "$MSYSTEM" == "CLANGARM64" ]]; then + ARCH="clang-aarch64" + PREFIX="clangarm64" +else + ARCH="x86_64" + PREFIX="mingw64" +fi + +pacman --noconfirm -Syu + +pacman --noconfirm -S --needed \ + mingw-w64-${ARCH}-gettext + +cd "${SCRIPT_DIR}/../" + +/${PREFIX}/bin/xgettext -f "${SCRIPT_DIR}/POTFILES" -o "${SCRIPT_DIR}/reminders.pot" --keyword=_ --add-comments=Translators --from-code=UTF-8 --package-name=reminders diff --git a/src/browser/about.py b/src/browser/about.py index 13d4fd6..fcba86e 100644 --- a/src/browser/about.py +++ b/src/browser/about.py @@ -14,11 +14,12 @@ # this program. If not, see . from reminders import info -from gi.repository import Adw, Gtk, GLib +from gi.repository import Adw, Gtk from gettext import gettext as _ RELEASE_NOTES = '''
        +
      • Windows port
      • UI improvements
      • Added support for making the week start on sunday
      • Added indicators that show how many incomplete reminders are in each list/group
      • diff --git a/src/browser/application.py b/src/browser/application.py index 1a6ebd3..18513e9 100644 --- a/src/browser/application.py +++ b/src/browser/application.py @@ -35,7 +35,7 @@ from gettext import gettext as _ from pkg_resources import parse_version from traceback import format_exception -from os import environ, sep +from os import environ, sep, path if info.on_windows: from time import sleep @@ -71,27 +71,6 @@ def __init__(self, **kwargs): _('Print the version of the app'), None ) - self.add_main_option( - 'no-activate', ord('n'), - GLib.OptionFlags.NONE, - GLib.OptionArg.NONE, - _("Don't activate app, this might cause issues"), - None - ) - self.add_main_option( - 'action', ord('a'), - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING, - _('Run an action'), - None - ) - self.add_main_option( - 'params', ord('p'), - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING, - _('String parameter for the action if required'), - None - ) self.add_main_option( 'restart-service', ord('r'), GLib.OptionFlags.NONE, @@ -110,6 +89,9 @@ def __init__(self, **kwargs): def do_command_line(self, command): commands = command.get_options_dict() + no_activate = False + action = None + param = None if commands.contains('version'): print(info.version) @@ -117,20 +99,36 @@ def do_command_line(self, command): self.restart = commands.contains('restart-service') - if not commands.contains('no-activate'): + files = commands.lookup_value(GLib.OPTION_REMAINING) + imports = [] + if files: + for file in files: + # handling for windows URL protocol activation + prefix = f'{info.app_id}:' + if file.startswith(prefix): + args = file[len(prefix):] + args = args.split(';') + for arg in args: + if arg == 'no-activate': + no_activate = True + elif '=' in arg: + arg = arg.split('=', 1) + if arg[0] == 'action': + action = arg[1] + if arg[0] == 'param': + param = GLib.Variant('s', arg[1]) + self.do_activate + elif path.exists(file): + imports.append(file) + + if not no_activate: self.do_activate() - if commands.contains('action'): - action = commands.lookup_value('action').get_string() - params = commands.lookup_value('params').get_string() if commands.contains('params') else None - try: - self.activate_action(action, GLib.Variant('s', params) if params is not None else params) - except Exception as error: - self.logger.exception(error) + if action is not None: + self.activate_action(action, param) - files = commands.lookup_value(GLib.OPTION_REMAINING) - if files: - self.open_files(files) + if len(imports) > 0: + self.open_files(imports) return 0 @@ -466,18 +464,30 @@ def show_shortcuts(self, action, data): ShortcutsWindow(self.win) def export(self, action, data): - ExportListsWindow(self) + dialog = Gtk.FileDialog.new() + + dialog.select_folder(self.win, None, self.export_cb) + + def export_cb(self, dialog, result, data = None): + try: + folder = dialog.select_folder_finish(result) + except: + return + + ExportListsWindow(self, folder) def import_lists(self, action, data): dialog = Gtk.FileDialog.new() filters = Gio.ListStore.new(Gtk.FileFilter) file_filter = Gtk.FileFilter.new() - file_filter.add_mime_type('text/calendar') + if info.on_windows: + file_filter.add_pattern('*.ics') + file_filter.add_pattern('*.ical') + else: + file_filter.add_mime_type('text/calendar') filters.append(file_filter) dialog.set_filters(filters) dialog.open_multiple(self.win, None, self.open_cb) - if info.on_windows: - self.center_win_on_parent(dialog) def open_cb(self, dialog, result, data = None): try: diff --git a/src/browser/export_lists_window.py b/src/browser/export_lists_window.py index 9592685..048400b 100644 --- a/src/browser/export_lists_window.py +++ b/src/browser/export_lists_window.py @@ -34,11 +34,12 @@ class ExportListsWindow(Adw.Window): lists = Gtk.Template.Child() - def __init__(self, app, *args, **kwargs): + def __init__(self, app, folder, *args, **kwargs): super().__init__(*args, **kwargs) self.app = app self.win = app.win self.rows = {} + self.folder = folder self.set_transient_for(self.win) for list_id, value in self.win.synced_lists.items(): @@ -73,9 +74,7 @@ def on_save(self, button = None): if len(lists) > 0: try: - result = self.app.run_service_method('ExportLists', GLib.Variant('(as)', (lists,))) - folder = result.unpack()[0] - uri = GLib.filename_to_uri(folder, None) + self.app.run_service_method('ExportLists', GLib.Variant('(sas)', (self.folder.get_path(), lists))) dialog = Adw.MessageDialog( transient_for=self, heading=_('Success!'), @@ -87,7 +86,7 @@ def on_save(self, button = None): dialog.set_default_response('cancel') dialog.set_close_response('cancel') dialog.connect('response::close', lambda *args: self.close()) - dialog.connect('response::yes', lambda *args: self.launch_folder(uri)) + dialog.connect('response::yes', lambda *args: self.launch_folder(self.folder.get_uri())) dialog.present() diff --git a/src/browser/main_window.py b/src/browser/main_window.py index 1db5027..44498ff 100644 --- a/src/browser/main_window.py +++ b/src/browser/main_window.py @@ -375,7 +375,7 @@ def selected_changed(self, list_box = None): def new_edit_win(self, reminder = None): if self.reminder_edit_win is None: self.reminder_edit_win = ReminderEditWindow(self, self.app, reminder) - self.reminder_edit_win.connect('close-request', self.close_edit_win) + self.reminder_edit_win.connect('close-request', self.close_request_cb) self.reminder_edit_win.present() if info.on_windows: @@ -384,7 +384,7 @@ def new_edit_win(self, reminder = None): self.reminder_edit_win.setup(reminder) self.reminder_edit_win.set_visible(True) - def close_edit_win(self, window = None): + def close_request_cb(self, window = None): if self.reminder_edit_win.check_changed(self.reminder_edit_win.get_options()): confirm_dialog = Adw.MessageDialog( transient_for=self.reminder_edit_win, @@ -396,13 +396,21 @@ def close_edit_win(self, window = None): confirm_dialog.set_response_appearance('yes', Adw.ResponseAppearance.DESTRUCTIVE) confirm_dialog.set_default_response('cancel') confirm_dialog.set_close_response('cancel') - confirm_dialog.connect('response::yes', lambda *args: self.reminder_edit_win.set_visible(False)) + confirm_dialog.connect('response::yes', lambda *args: self.close_edit_win()) confirm_dialog.present() if info.on_windows: self.app.center_win_on_parent(confirm_dialog) - return True + else: + self.close_edit_win() + + return True + + def close_edit_win(self): + if info.on_windows: + self.reminder_edit_win.destroy() + self.reminder_edit_win = None else: self.reminder_edit_win.set_visible(False) diff --git a/src/browser/preferences.py b/src/browser/preferences.py index 5c3bd76..8e835a0 100644 --- a/src/browser/preferences.py +++ b/src/browser/preferences.py @@ -31,6 +31,9 @@ class PreferencesWindow(Adw.PreferencesWindow): '''Settings Window''' __gtype_name__ = 'PreferencesWindow' + general = Gtk.Template.Child() + sound_row = Gtk.Template.Child() + sound_row_win = Gtk.Template.Child() sound_switch = Gtk.Template.Child() sound_theme_switch = Gtk.Template.Child() time_format_row = Gtk.Template.Child() @@ -49,8 +52,6 @@ def __init__(self, app, **kwargs): self.settings = app.settings self.set_transient_for(self.app.win) self.settings.bind('week-starts-sunday', self.week_switch, 'active', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('notification-sound', self.sound_switch, 'enable-expansion', Gio.SettingsBindFlags.DEFAULT) - self.settings.bind('included-notification-sound', self.sound_theme_switch, 'active', Gio.SettingsBindFlags.DEFAULT) self.settings.connect('changed::time-format', lambda *args: self.update_time_dropdown()) self.settings.connect('changed::refresh-frequency', lambda *args: self.update_refresh_dropdown()) self.settings.connect('changed::synced-lists', lambda *args: self.synced_lists_updated()) @@ -63,6 +64,14 @@ def __init__(self, app, **kwargs): self.synced = self.settings.get_value('synced-lists').unpack() self.user_rows = {} + if info.on_windows: + self.settings.bind('notification-sound', self.sound_switch, 'active', Gio.SettingsBindFlags.DEFAULT) + self.general.remove(self.sound_row) + else: + self.settings.bind('notification-sound', self.sound_row, 'enable-expansion', Gio.SettingsBindFlags.DEFAULT) + self.settings.bind('included-notification-sound', self.sound_theme_switch, 'active', Gio.SettingsBindFlags.DEFAULT) + self.general.remove(self.sound_row_win) + for user_id, username in self.app.win.ms_users.items(): self.on_ms_signed_in(user_id, username) for user_id, username in self.app.win.caldav_users.items(): diff --git a/src/browser/reminder_edit_window.py b/src/browser/reminder_edit_window.py index 1228456..48c7274 100644 --- a/src/browser/reminder_edit_window.py +++ b/src/browser/reminder_edit_window.py @@ -474,8 +474,8 @@ def do_save(self, data = None): self.win.reminders_list.invalidate_sort() if info.on_windows: - self.close() - self.win.reminder_edit_window = None + self.destroy() + self.win.reminder_edit_win = None else: self.set_visible(False) @@ -658,7 +658,7 @@ def wrap_hour(self, button = None): @Gtk.Template.Callback() def on_cancel(self, button = None): - self.win.close_edit_win() + self.win.close_request_cb() @Gtk.Template.Callback() def on_save(self, button = None): diff --git a/src/browser/reminders.py b/src/browser/reminders.py index e1c02d7..c233702 100755 --- a/src/browser/reminders.py +++ b/src/browser/reminders.py @@ -31,6 +31,7 @@ environ['REMINDERS_PATH'] = REMINDERS_PATH environ['GSK_RENDERER'] = 'cairo' +environ['PANGOCAIRO_BACKEND'] = 'fc' if __name__ == '__main__': from reminders import info diff --git a/src/browser/resources/ui/preferences.ui b/src/browser/resources/ui/preferences.ui index 00ccc34..600258f 100644 --- a/src/browser/resources/ui/preferences.ui +++ b/src/browser/resources/ui/preferences.ui @@ -106,7 +106,7 @@
- + General @@ -126,7 +126,7 @@ - + Play sound with notification true @@ -143,6 +143,17 @@ + + + Play sound with notification + sound_switch + + + center + + + + diff --git a/src/service/application.py b/src/service/application.py index c609c32..f25f5c7 100644 --- a/src/service/application.py +++ b/src/service/application.py @@ -22,9 +22,6 @@ from os import environ, sep from gettext import gettext as _ -if info.on_windows: - from subprocess import Popen, CREATE_NEW_CONSOLE - class RemindersService(Gio.Application): '''Background service for working with reminders''' def __init__(self, **kwargs): @@ -33,14 +30,6 @@ def __init__(self, **kwargs): try: self.sandboxed = False self.portal = None - self.watcher_id = None - self.add_main_option( - 'action', ord('a'), - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING, - _('Run an action'), - None - ) self.logger.info(f'Starting {info.service_executable} version {info.version}') self.settings = Gio.Settings(info.base_app_id) @@ -62,7 +51,7 @@ def __init__(self, **kwargs): if self.portal.running_under_sandbox(): self.sandboxed = True - if not self.sandboxed: + if not self.sandboxed and not info.on_windows: # xdg-desktop-portal will try to run the actions on the frontend when the notification is interacted with # for this reason, we only need the actions here if we are not sandboxed self.create_action('reminder-completed', self.notification_completed_cb, GLib.VariantType.new('s')) @@ -76,39 +65,6 @@ def __init__(self, **kwargs): self.logger.exception(error) raise error - def do_command_line(self, command): - commands = command.get_options_dict() - - if commands.contains('restart-service'): - self.restart = True - - if commands.contains('version'): - print(info.version) - sys.exit(0) - - if commands.contains('page'): - value = commands.lookup_value('page').get_string() - if value in ('upcoming', 'past', 'completed'): - self.page = value - else: - print(f'{value} is not a valid page') - - self.do_activate() - - if commands.contains('action'): - action = commands.lookup_value('action').get_string() - params = commands.lookup_value('params').get_string() if commands.contains('params') else None - try: - self.activate_action(action, GLib.Variant('s', params) if params is not None else params) - except Exception as error: - self.logger.exception(error) - - files = commands.lookup_value(GLib.OPTION_REMAINING) - if files: - self.open_files(files) - - return 0 - def do_startup(self): Gio.Application.do_startup(self) self.reminders.start_countdowns() @@ -123,25 +79,9 @@ def create_action(self, name, callback, variant = None): self.add_action(action) def launch_browser(self, action = None, variant = None): - if info.on_windows: - if info.app_executable.endswith('exe'): - Popen([environ['SERVICE_PATH'] + sep + info.app_executable], creationflags=CREATE_NEW_CONSOLE) - else: - Popen([sys.executable, environ['SERVICE_PATH'] + sep + info.app_executable], creationflags=CREATE_NEW_CONSOLE) - self.watcher_id = Gio.bus_watch_name( - Gio.BusType.SESSION, - info.app_id, - Gio.BusNameWatcherFlags.NONE, - lambda *args: self.do_launch_browser(), - None - ) - else: - self.do_launch_browser() + self.do_launch_browser() def do_launch_browser(self): - if self.watcher_id is not None: - Gio.bus_unwatch_name(self.watcher_id) - self.watcher_id = None browser = Gio.DBusProxy.new_for_bus_sync( Gio.BusType.SESSION, Gio.DBusProxyFlags.NONE, @@ -182,7 +122,7 @@ def main(): try: app = RemindersService( application_id=info.service_id, - flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE + flags=Gio.ApplicationFlags.DEFAULT_FLAGS ) return app.run(sys.argv) except Exception as error: diff --git a/src/service/backend.py b/src/service/backend.py index 324c69e..956fcfc 100644 --- a/src/service/backend.py +++ b/src/service/backend.py @@ -683,8 +683,8 @@ def _create_notification_windows(self, reminder_id): duration="long" scenario="reminder" displayTimestamp="{self._timestamp_to_rfc(reminder['timestamp'])}" - launch="--action=notification-clicked" - activationType="foreground"> + launch="{info.app_id}:action=notification-clicked" + activationType="protocol"> {reminder['title']} @@ -694,9 +694,10 @@ def _create_notification_windows(self, reminder_id): + arguments="{info.app_id}:no-activate;action=reminder-completed;param={reminder_id}" + activationType="protocol"/> +