From c1f98dc3a71a01d20422505d15a80a0902989d06 Mon Sep 17 00:00:00 2001 From: wingsummer <1326224942@qq.com> Date: Mon, 26 Sep 2022 14:39:51 +0800 Subject: [PATCH] first commit --- .gitignore | 2 + LICENSE | 661 ++++++++++++++++++++++++++++++++++ QHotkey/LICENSE | 27 ++ QHotkey/qhotkey.cpp | 326 +++++++++++++++++ QHotkey/qhotkey.h | 124 +++++++ QHotkey/qhotkey_p.h | 59 +++ QHotkey/qhotkey_x11.cpp | 231 ++++++++++++ README.md | 0 WingTool.pro | 42 +++ class/appmanager.cpp | 117 ++++++ class/appmanager.h | 57 +++ class/eventmonitor.cpp | 184 ++++++++++ class/eventmonitor.h | 74 ++++ class/settingmanager.cpp | 6 + class/settingmanager.h | 14 + class/settings.cpp | 6 + class/settings.h | 11 + class/wingapplication.cpp | 69 ++++ class/wingapplication.h | 16 + dialog/centerwindow.cpp | 301 ++++++++++++++++ dialog/centerwindow.h | 57 +++ dialog/shortcuteditdialog.cpp | 91 +++++ dialog/shortcuteditdialog.h | 40 ++ dialog/toolboxwindow.cpp | 6 + dialog/toolboxwindow.h | 11 + dialog/toolwindow.cpp | 66 ++++ dialog/toolwindow.h | 31 ++ images/author.jpg | Bin 0 -> 50128 bytes images/close.png | Bin 0 -> 6363 bytes images/logo.svg | 54 +++ main.cpp | 96 +++++ plugin/iwingtoolplg.h | 106 ++++++ plugin/pluginsystem.cpp | 9 + plugin/pluginsystem.h | 35 ++ resources.qrc | 8 + sponsor.png | Bin 0 -> 794217 bytes utilies.h | 17 + 37 files changed, 2954 insertions(+) create mode 100755 .gitignore create mode 100644 LICENSE create mode 100644 QHotkey/LICENSE create mode 100644 QHotkey/qhotkey.cpp create mode 100644 QHotkey/qhotkey.h create mode 100644 QHotkey/qhotkey_p.h create mode 100644 QHotkey/qhotkey_x11.cpp create mode 100644 README.md create mode 100644 WingTool.pro create mode 100644 class/appmanager.cpp create mode 100644 class/appmanager.h create mode 100644 class/eventmonitor.cpp create mode 100644 class/eventmonitor.h create mode 100644 class/settingmanager.cpp create mode 100644 class/settingmanager.h create mode 100644 class/settings.cpp create mode 100644 class/settings.h create mode 100644 class/wingapplication.cpp create mode 100644 class/wingapplication.h create mode 100644 dialog/centerwindow.cpp create mode 100644 dialog/centerwindow.h create mode 100644 dialog/shortcuteditdialog.cpp create mode 100644 dialog/shortcuteditdialog.h create mode 100644 dialog/toolboxwindow.cpp create mode 100644 dialog/toolboxwindow.h create mode 100644 dialog/toolwindow.cpp create mode 100644 dialog/toolwindow.h create mode 100755 images/author.jpg create mode 100755 images/close.png create mode 100644 images/logo.svg create mode 100644 main.cpp create mode 100644 plugin/iwingtoolplg.h create mode 100644 plugin/pluginsystem.cpp create mode 100644 plugin/pluginsystem.h create mode 100644 resources.qrc create mode 100644 sponsor.png create mode 100644 utilies.h diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..5ee5d2c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +**/*.pro.user +push.sh diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3140d42 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. httpfsf.org + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are 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. + + 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. + + Developers that use our General Public Licenses protect your rights +with two steps (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +andor modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + 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 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 work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised andor new versions of +the GNU Affero 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 Affero 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 Affero 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 Affero 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 ANDOR 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 ANDOR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the copyright line and a pointer to where the full notice is found. + + one line to give the program's name and a brief idea of what it does. + Copyright (C) year name of author + + This program is free software you can redistribute it andor modify + it under the terms of the GNU Affero 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see httpwww.gnu.orglicenses. + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a Source link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + 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 AGPL, see +httpwww.gnu.orglicenses. diff --git a/QHotkey/LICENSE b/QHotkey/LICENSE new file mode 100644 index 0000000..55e0b00 --- /dev/null +++ b/QHotkey/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2016, Felix Barz +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of QHotkey nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/QHotkey/qhotkey.cpp b/QHotkey/qhotkey.cpp new file mode 100644 index 0000000..d514b6b --- /dev/null +++ b/QHotkey/qhotkey.cpp @@ -0,0 +1,326 @@ +#include "qhotkey.h" +#include "qhotkey_p.h" +#include +#include +#include +#include +#include + +Q_LOGGING_CATEGORY(logQHotkey, "QHotkey") + +void QHotkey::addGlobalMapping(const QKeySequence &shortcut, + QHotkey::NativeShortcut nativeShortcut) { + QMetaObject::invokeMethod( + QHotkeyPrivate::instance(), "addMappingInvoked", Qt::QueuedConnection, + Q_ARG(Qt::Key, Qt::Key(uint(shortcut[0]) & ~Qt::KeyboardModifierMask)), + Q_ARG( + Qt::KeyboardModifiers, + Qt::KeyboardModifiers(uint(shortcut[0]) & Qt::KeyboardModifierMask)), + Q_ARG(QHotkey::NativeShortcut, nativeShortcut)); +} + +bool QHotkey::isPlatformSupported() { + return QHotkeyPrivate::isPlatformSupported(); +} + +QHotkey::QHotkey(QObject *parent) + : QObject(parent), _keyCode(Qt::Key_unknown), _modifiers(Qt::NoModifier), + _registered(false) {} + +QHotkey::QHotkey(const QKeySequence &shortcut, bool autoRegister, + QObject *parent) + : QHotkey(parent) { + setShortcut(shortcut, autoRegister); +} + +QHotkey::QHotkey(Qt::Key keyCode, Qt::KeyboardModifiers modifiers, + bool autoRegister, QObject *parent) + : QHotkey(parent) { + setShortcut(keyCode, modifiers, autoRegister); +} + +QHotkey::QHotkey(QHotkey::NativeShortcut shortcut, bool autoRegister, + QObject *parent) + : QHotkey(parent) { + setNativeShortcut(shortcut, autoRegister); +} + +QHotkey::~QHotkey() { + if (_registered) + QHotkeyPrivate::instance()->removeShortcut(this); +} + +QKeySequence QHotkey::shortcut() const { + if (_keyCode == Qt::Key_unknown) + return QKeySequence(); + return QKeySequence(static_cast(_keyCode | _modifiers)); +} + +Qt::Key QHotkey::keyCode() const { return _keyCode; } + +Qt::KeyboardModifiers QHotkey::modifiers() const { return _modifiers; } + +QHotkey::NativeShortcut QHotkey::currentNativeShortcut() const { + return _nativeShortcut; +} + +bool QHotkey::isRegistered() const { return _registered; } + +bool QHotkey::setShortcut(const QKeySequence &shortcut, bool autoRegister) { + if (shortcut.isEmpty()) + return resetShortcut(); + if (shortcut.count() > 1) { + qCWarning(logQHotkey, + "Keysequences with multiple shortcuts are not allowed! " + "Only the first shortcut will be used!"); + } + + return setShortcut( + Qt::Key(uint(shortcut[0]) & ~Qt::KeyboardModifierMask), + Qt::KeyboardModifiers(uint(shortcut[0]) & Qt::KeyboardModifierMask), + autoRegister); +} + +bool QHotkey::setShortcut(Qt::Key keyCode, Qt::KeyboardModifiers modifiers, + bool autoRegister) { + if (_registered) { + if (autoRegister) { + if (!QHotkeyPrivate::instance()->removeShortcut(this)) + return false; + } else + return false; + } + + if (keyCode == Qt::Key_unknown) { + _keyCode = Qt::Key_unknown; + _modifiers = Qt::NoModifier; + _nativeShortcut = NativeShortcut(); + return true; + } + + _keyCode = keyCode; + _modifiers = modifiers; + _nativeShortcut = + QHotkeyPrivate::instance()->nativeShortcut(keyCode, modifiers); + if (_nativeShortcut.isValid()) { + if (autoRegister) + return QHotkeyPrivate::instance()->addShortcut(this); + return true; + } + + qCWarning(logQHotkey) << "Unable to map shortcut to native keys. Key:" + << keyCode << "Modifiers:" << modifiers; + _keyCode = Qt::Key_unknown; + _modifiers = Qt::NoModifier; + _nativeShortcut = NativeShortcut(); + return false; +} + +bool QHotkey::resetShortcut() { + if (_registered && !QHotkeyPrivate::instance()->removeShortcut(this)) { + return false; + } + + _keyCode = Qt::Key_unknown; + _modifiers = Qt::NoModifier; + _nativeShortcut = NativeShortcut(); + return true; +} + +bool QHotkey::setNativeShortcut(QHotkey::NativeShortcut nativeShortcut, + bool autoRegister) { + if (_registered) { + if (autoRegister) { + if (!QHotkeyPrivate::instance()->removeShortcut(this)) + return false; + } else + return false; + } + + if (nativeShortcut.isValid()) { + _keyCode = Qt::Key_unknown; + _modifiers = Qt::NoModifier; + _nativeShortcut = nativeShortcut; + if (autoRegister) + return QHotkeyPrivate::instance()->addShortcut(this); + return true; + } + + _keyCode = Qt::Key_unknown; + _modifiers = Qt::NoModifier; + _nativeShortcut = NativeShortcut(); + return true; +} + +bool QHotkey::setRegistered(bool registered) { + if (_registered && !registered) + return QHotkeyPrivate::instance()->removeShortcut(this); + if (!_registered && registered) { + if (!_nativeShortcut.isValid()) + return false; + return QHotkeyPrivate::instance()->addShortcut(this); + } + return true; +} + +// ---------- QHotkeyPrivate implementation ---------- + +QHotkeyPrivate::QHotkeyPrivate() { + Q_ASSERT_X(qApp, Q_FUNC_INFO, + "QHotkey requires QCoreApplication to be instantiated"); + qApp->eventDispatcher()->installNativeEventFilter(this); +} + +QHotkeyPrivate::~QHotkeyPrivate() { + if (!shortcuts.isEmpty()) + qCWarning(logQHotkey) + << "QHotkeyPrivate destroyed with registered shortcuts!"; + if (qApp && qApp->eventDispatcher()) + qApp->eventDispatcher()->removeNativeEventFilter(this); +} + +QHotkey::NativeShortcut +QHotkeyPrivate::nativeShortcut(Qt::Key keycode, + Qt::KeyboardModifiers modifiers) { + Qt::ConnectionType conType = + (QThread::currentThread() == thread() ? Qt::DirectConnection + : Qt::BlockingQueuedConnection); + QHotkey::NativeShortcut res; + if (!QMetaObject::invokeMethod(this, "nativeShortcutInvoked", conType, + Q_RETURN_ARG(QHotkey::NativeShortcut, res), + Q_ARG(Qt::Key, keycode), + Q_ARG(Qt::KeyboardModifiers, modifiers))) { + return QHotkey::NativeShortcut(); + } + return res; +} + +bool QHotkeyPrivate::addShortcut(QHotkey *hotkey) { + if (hotkey->_registered) + return false; + + Qt::ConnectionType conType = + (QThread::currentThread() == thread() ? Qt::DirectConnection + : Qt::BlockingQueuedConnection); + bool res = false; + if (!QMetaObject::invokeMethod(this, "addShortcutInvoked", conType, + Q_RETURN_ARG(bool, res), + Q_ARG(QHotkey *, hotkey))) { + return false; + } + + if (res) + emit hotkey->registeredChanged(true); + return res; +} + +bool QHotkeyPrivate::removeShortcut(QHotkey *hotkey) { + if (!hotkey->_registered) + return false; + + Qt::ConnectionType conType = + (QThread::currentThread() == thread() ? Qt::DirectConnection + : Qt::BlockingQueuedConnection); + bool res = false; + if (!QMetaObject::invokeMethod(this, "removeShortcutInvoked", conType, + Q_RETURN_ARG(bool, res), + Q_ARG(QHotkey *, hotkey))) { + return false; + } + + if (res) + emit hotkey->registeredChanged(false); + return res; +} + +void QHotkeyPrivate::activateShortcut(QHotkey::NativeShortcut shortcut) { + QMetaMethod signal = QMetaMethod::fromSignal(&QHotkey::activated); + for (QHotkey *hkey : shortcuts.values(shortcut)) + signal.invoke(hkey, Qt::QueuedConnection); +} + +void QHotkeyPrivate::releaseShortcut(QHotkey::NativeShortcut shortcut) { + QMetaMethod signal = QMetaMethod::fromSignal(&QHotkey::released); + for (QHotkey *hkey : shortcuts.values(shortcut)) + signal.invoke(hkey, Qt::QueuedConnection); +} + +void QHotkeyPrivate::addMappingInvoked(Qt::Key keycode, + Qt::KeyboardModifiers modifiers, + QHotkey::NativeShortcut nativeShortcut) { + mapping.insert({keycode, modifiers}, nativeShortcut); +} + +bool QHotkeyPrivate::addShortcutInvoked(QHotkey *hotkey) { + QHotkey::NativeShortcut shortcut = hotkey->_nativeShortcut; + + if (!shortcuts.contains(shortcut)) { + if (!registerShortcut(shortcut)) { + qCWarning(logQHotkey) << QHotkey::tr("Failed to register %1. Error: %2") + .arg(hotkey->shortcut().toString(), error); + return false; + } + } + + shortcuts.insert(shortcut, hotkey); + hotkey->_registered = true; + return true; +} + +bool QHotkeyPrivate::removeShortcutInvoked(QHotkey *hotkey) { + QHotkey::NativeShortcut shortcut = hotkey->_nativeShortcut; + + if (shortcuts.remove(shortcut, hotkey) == 0) + return false; + hotkey->_registered = false; + emit hotkey->registeredChanged(true); + if (shortcuts.count(shortcut) == 0) { + if (!unregisterShortcut(shortcut)) { + qCWarning(logQHotkey) << QHotkey::tr("Failed to unregister %1. Error: %2") + .arg(hotkey->shortcut().toString(), error); + return false; + } + return true; + } + return true; +} + +QHotkey::NativeShortcut +QHotkeyPrivate::nativeShortcutInvoked(Qt::Key keycode, + Qt::KeyboardModifiers modifiers) { + if (mapping.contains({keycode, modifiers})) + return mapping.value({keycode, modifiers}); + + bool ok1 = false; + auto k = nativeKeycode(keycode, ok1); + bool ok2 = false; + auto m = nativeModifiers(modifiers, ok2); + if (ok1 && ok2) + return {k, m}; + return {}; +} + +QHotkey::NativeShortcut::NativeShortcut() : key(), modifier(), valid(false) {} + +QHotkey::NativeShortcut::NativeShortcut(quint32 key, quint32 modifier) + : key(key), modifier(modifier), valid(true) {} + +bool QHotkey::NativeShortcut::isValid() const { return valid; } + +bool QHotkey::NativeShortcut::operator==(QHotkey::NativeShortcut other) const { + return (key == other.key) && (modifier == other.modifier) && + valid == other.valid; +} + +bool QHotkey::NativeShortcut::operator!=(QHotkey::NativeShortcut other) const { + return (key != other.key) || (modifier != other.modifier) || + valid != other.valid; +} + +uint qHash(QHotkey::NativeShortcut key) { + return qHash(key.key) ^ qHash(key.modifier); +} + +uint qHash(QHotkey::NativeShortcut key, uint seed) { + return qHash(key.key, seed) ^ qHash(key.modifier, seed); +} diff --git a/QHotkey/qhotkey.h b/QHotkey/qhotkey.h new file mode 100644 index 0000000..f669640 --- /dev/null +++ b/QHotkey/qhotkey.h @@ -0,0 +1,124 @@ +#ifndef QHOTKEY_H +#define QHOTKEY_H + +#include +#include +#include +#include + +#ifdef QHOTKEY_LIB + #ifdef QHOTKEY_LIB_BUILD + #define QHOTKEY_SHARED_EXPORT Q_DECL_EXPORT + #else + #define QHOTKEY_SHARED_EXPORT Q_DECL_IMPORT + #endif +#else + #define QHOTKEY_SHARED_EXPORT +#endif + +//! A class to define global, systemwide Hotkeys +class QHOTKEY_SHARED_EXPORT QHotkey : public QObject +{ + Q_OBJECT + //! @private + friend class QHotkeyPrivate; + + //! Specifies whether this hotkey is currently registered or not + Q_PROPERTY(bool registered READ isRegistered WRITE setRegistered NOTIFY registeredChanged) + //! Holds the shortcut this hotkey will be triggered on + Q_PROPERTY(QKeySequence shortcut READ shortcut WRITE setShortcut RESET resetShortcut) + +public: + //! Defines shortcut with native keycodes + class QHOTKEY_SHARED_EXPORT NativeShortcut { + public: + //! The native keycode + quint32 key; + //! The native modifiers + quint32 modifier; + + //! Creates an invalid native shortcut + NativeShortcut(); + //! Creates a valid native shortcut, with the given key and modifiers + NativeShortcut(quint32 key, quint32 modifier = 0); + + //! Checks, whether this shortcut is valid or not + bool isValid() const; + + //! Equality operator + bool operator ==(NativeShortcut other) const; + //! Inequality operator + bool operator !=(NativeShortcut other) const; + + private: + bool valid; + }; + + //! Adds a global mapping of a key sequence to a replacement native shortcut + static void addGlobalMapping(const QKeySequence &shortcut, NativeShortcut nativeShortcut); + + //! Checks if global shortcuts are supported by the current platform + static bool isPlatformSupported(); + + //! Default Constructor + explicit QHotkey(QObject *parent = nullptr); + //! Constructs a hotkey with a shortcut and optionally registers it + explicit QHotkey(const QKeySequence &shortcut, bool autoRegister = false, QObject *parent = nullptr); + //! Constructs a hotkey with a key and modifiers and optionally registers it + explicit QHotkey(Qt::Key keyCode, Qt::KeyboardModifiers modifiers, bool autoRegister = false, QObject *parent = nullptr); + //! Constructs a hotkey from a native shortcut and optionally registers it + explicit QHotkey(NativeShortcut shortcut, bool autoRegister = false, QObject *parent = nullptr); + ~QHotkey() override; + + //! @readAcFn{QHotkey::registered} + bool isRegistered() const; + //! @readAcFn{QHotkey::shortcut} + QKeySequence shortcut() const; + //! @readAcFn{QHotkey::shortcut} - the key only + Qt::Key keyCode() const; + //! @readAcFn{QHotkey::shortcut} - the modifiers only + Qt::KeyboardModifiers modifiers() const; + + //! Get the current native shortcut + NativeShortcut currentNativeShortcut() const; + +public slots: + //! @writeAcFn{QHotkey::registered} + bool setRegistered(bool registered); + + //! @writeAcFn{QHotkey::shortcut} + bool setShortcut(const QKeySequence &shortcut, bool autoRegister = false); + //! @writeAcFn{QHotkey::shortcut} + bool setShortcut(Qt::Key keyCode, Qt::KeyboardModifiers modifiers, bool autoRegister = false); + //! @resetAcFn{QHotkey::shortcut} + bool resetShortcut(); + + //! Set this hotkey to a native shortcut + bool setNativeShortcut(QHotkey::NativeShortcut nativeShortcut, bool autoRegister = false); + +signals: + //! Will be emitted if the shortcut is pressed + void activated(QPrivateSignal); + + //! Will be emitted if the shortcut press is released + void released(QPrivateSignal); + + //! @notifyAcFn{QHotkey::registered} + void registeredChanged(bool registered); + +private: + Qt::Key _keyCode; + Qt::KeyboardModifiers _modifiers; + + NativeShortcut _nativeShortcut; + bool _registered; +}; + +uint QHOTKEY_SHARED_EXPORT qHash(QHotkey::NativeShortcut key); +uint QHOTKEY_SHARED_EXPORT qHash(QHotkey::NativeShortcut key, uint seed); + +QHOTKEY_SHARED_EXPORT Q_DECLARE_LOGGING_CATEGORY(logQHotkey) + +Q_DECLARE_METATYPE(QHotkey::NativeShortcut) + +#endif // QHOTKEY_H diff --git a/QHotkey/qhotkey_p.h b/QHotkey/qhotkey_p.h new file mode 100644 index 0000000..b7c1721 --- /dev/null +++ b/QHotkey/qhotkey_p.h @@ -0,0 +1,59 @@ +#ifndef QHOTKEY_P_H +#define QHOTKEY_P_H + +#include "qhotkey.h" +#include +#include +#include +#include + +class QHOTKEY_SHARED_EXPORT QHotkeyPrivate : public QObject, public QAbstractNativeEventFilter +{ + Q_OBJECT + +public: + QHotkeyPrivate();//singleton!!! + ~QHotkeyPrivate(); + + static QHotkeyPrivate *instance(); + static bool isPlatformSupported(); + + QHotkey::NativeShortcut nativeShortcut(Qt::Key keycode, Qt::KeyboardModifiers modifiers); + + bool addShortcut(QHotkey *hotkey); + bool removeShortcut(QHotkey *hotkey); + +protected: + void activateShortcut(QHotkey::NativeShortcut shortcut); + void releaseShortcut(QHotkey::NativeShortcut shortcut); + + virtual quint32 nativeKeycode(Qt::Key keycode, bool &ok) = 0;//platform implement + virtual quint32 nativeModifiers(Qt::KeyboardModifiers modifiers, bool &ok) = 0;//platform implement + + virtual bool registerShortcut(QHotkey::NativeShortcut shortcut) = 0;//platform implement + virtual bool unregisterShortcut(QHotkey::NativeShortcut shortcut) = 0;//platform implement + + QString error; + +private: + QHash, QHotkey::NativeShortcut> mapping; + QMultiHash shortcuts; + + Q_INVOKABLE void addMappingInvoked(Qt::Key keycode, Qt::KeyboardModifiers modifiers, QHotkey::NativeShortcut nativeShortcut); + Q_INVOKABLE bool addShortcutInvoked(QHotkey *hotkey); + Q_INVOKABLE bool removeShortcutInvoked(QHotkey *hotkey); + Q_INVOKABLE QHotkey::NativeShortcut nativeShortcutInvoked(Qt::Key keycode, Qt::KeyboardModifiers modifiers); +}; + +#define NATIVE_INSTANCE(ClassName) \ + Q_GLOBAL_STATIC(ClassName, hotkeyPrivate) \ + \ + QHotkeyPrivate *QHotkeyPrivate::instance()\ + {\ + return hotkeyPrivate;\ + } + +Q_DECLARE_METATYPE(Qt::Key) +Q_DECLARE_METATYPE(Qt::KeyboardModifiers) + +#endif // QHOTKEY_P_H diff --git a/QHotkey/qhotkey_x11.cpp b/QHotkey/qhotkey_x11.cpp new file mode 100644 index 0000000..38f8772 --- /dev/null +++ b/QHotkey/qhotkey_x11.cpp @@ -0,0 +1,231 @@ +#include "qhotkey.h" +#include "qhotkey_p.h" +#include +#include +#include +#include +#include +#include + +// compability to pre Qt 5.8 +#ifndef Q_FALLTHROUGH +#define Q_FALLTHROUGH() (void)0 +#endif + +class QHotkeyPrivateX11 : public QHotkeyPrivate { +public: + // QAbstractNativeEventFilter interface + bool nativeEventFilter(const QByteArray &eventType, void *message, + long *result) Q_DECL_OVERRIDE; + +protected: + // QHotkeyPrivate interface + quint32 nativeKeycode(Qt::Key keycode, bool &ok) Q_DECL_OVERRIDE; + quint32 nativeModifiers(Qt::KeyboardModifiers modifiers, + bool &ok) Q_DECL_OVERRIDE; + static QString getX11String(Qt::Key keycode); + bool registerShortcut(QHotkey::NativeShortcut shortcut) Q_DECL_OVERRIDE; + bool unregisterShortcut(QHotkey::NativeShortcut shortcut) Q_DECL_OVERRIDE; + +private: + static const QVector specialModifiers; + static const quint32 validModsMask; + xcb_key_press_event_t prevHandledEvent; + xcb_key_press_event_t prevEvent; + + static QString formatX11Error(Display *display, int errorCode); + + class HotkeyErrorHandler { + public: + HotkeyErrorHandler(); + ~HotkeyErrorHandler(); + + static bool hasError; + static QString errorString; + + private: + XErrorHandler prevHandler; + + static int handleError(Display *display, XErrorEvent *error); + }; +}; +NATIVE_INSTANCE(QHotkeyPrivateX11) + +bool QHotkeyPrivate::isPlatformSupported() { return QX11Info::isPlatformX11(); } + +const QVector QHotkeyPrivateX11::specialModifiers = { + 0, Mod2Mask, LockMask, (Mod2Mask | LockMask)}; +const quint32 QHotkeyPrivateX11::validModsMask = + ShiftMask | ControlMask | Mod1Mask | Mod4Mask; + +bool QHotkeyPrivateX11::nativeEventFilter(const QByteArray &eventType, + void *message, long *result) { + Q_UNUSED(eventType) + Q_UNUSED(result) + + auto *genericEvent = static_cast(message); + if (genericEvent->response_type == XCB_KEY_PRESS) { + xcb_key_press_event_t keyEvent = + *static_cast(message); + this->prevEvent = keyEvent; + if (this->prevHandledEvent.response_type == XCB_KEY_RELEASE) { + if (this->prevHandledEvent.time == keyEvent.time) + return false; + } + this->activateShortcut( + {keyEvent.detail, keyEvent.state & QHotkeyPrivateX11::validModsMask}); + } else if (genericEvent->response_type == XCB_KEY_RELEASE) { + xcb_key_release_event_t keyEvent = + *static_cast(message); + this->prevEvent = keyEvent; + QTimer::singleShot(50, [this, keyEvent] { + if (this->prevEvent.time == keyEvent.time && + this->prevEvent.response_type == keyEvent.response_type && + this->prevEvent.detail == keyEvent.detail) { + this->releaseShortcut( + {keyEvent.detail, + keyEvent.state & QHotkeyPrivateX11::validModsMask}); + } + }); + this->prevHandledEvent = keyEvent; + } + + return false; +} + +QString QHotkeyPrivateX11::getX11String(Qt::Key keycode) { + switch (keycode) { + + case Qt::Key_MediaLast: + case Qt::Key_MediaPrevious: + return QStringLiteral("XF86AudioPrev"); + case Qt::Key_MediaNext: + return QStringLiteral("XF86AudioNext"); + case Qt::Key_MediaPause: + case Qt::Key_MediaPlay: + case Qt::Key_MediaTogglePlayPause: + return QStringLiteral("XF86AudioPlay"); + case Qt::Key_MediaRecord: + return QStringLiteral("XF86AudioRecord"); + case Qt::Key_MediaStop: + return QStringLiteral("XF86AudioStop"); + default: + return QKeySequence(keycode).toString(QKeySequence::NativeText); + } +} + +quint32 QHotkeyPrivateX11::nativeKeycode(Qt::Key keycode, bool &ok) { + QString keyString = getX11String(keycode); + + KeySym keysym = XStringToKeysym(keyString.toLatin1().constData()); + if (keysym == NoSymbol) { + // not found -> just use the key + if (keycode <= 0xFFFF) + keysym = keycode; + else + return 0; + } + + if (QX11Info::isPlatformX11()) { + auto res = XKeysymToKeycode(QX11Info::display(), keysym); + if (res != 0) + ok = true; + return res; + } + return 0; +} + +quint32 QHotkeyPrivateX11::nativeModifiers(Qt::KeyboardModifiers modifiers, + bool &ok) { + quint32 nMods = 0; + if (modifiers & Qt::ShiftModifier) + nMods |= ShiftMask; + if (modifiers & Qt::ControlModifier) + nMods |= ControlMask; + if (modifiers & Qt::AltModifier) + nMods |= Mod1Mask; + if (modifiers & Qt::MetaModifier) + nMods |= Mod4Mask; + ok = true; + return nMods; +} + +bool QHotkeyPrivateX11::registerShortcut(QHotkey::NativeShortcut shortcut) { + Display *display = QX11Info::display(); + if (!display || !QX11Info::isPlatformX11()) + return false; + + HotkeyErrorHandler errorHandler; + for (quint32 specialMod : QHotkeyPrivateX11::specialModifiers) { + XGrabKey(display, int(shortcut.key), shortcut.modifier | specialMod, + DefaultRootWindow(display), True, GrabModeAsync, GrabModeAsync); + } + XSync(display, False); + + if (errorHandler.hasError) { + error = errorHandler.errorString; + this->unregisterShortcut(shortcut); + return false; + } + return true; +} + +bool QHotkeyPrivateX11::unregisterShortcut(QHotkey::NativeShortcut shortcut) { + Display *display = QX11Info::display(); + if (!display) + return false; + + HotkeyErrorHandler errorHandler; + for (quint32 specialMod : QHotkeyPrivateX11::specialModifiers) { + XUngrabKey(display, int(shortcut.key), shortcut.modifier | specialMod, + XDefaultRootWindow(display)); + } + XSync(display, False); + + if (HotkeyErrorHandler::hasError) { + error = HotkeyErrorHandler::errorString; + return false; + } + return true; +} + +QString QHotkeyPrivateX11::formatX11Error(Display *display, int errorCode) { + char errStr[256]; + XGetErrorText(display, errorCode, errStr, 256); + return QString::fromLatin1(errStr); +} + +// ---------- QHotkeyPrivateX11::HotkeyErrorHandler implementation ---------- + +bool QHotkeyPrivateX11::HotkeyErrorHandler::hasError = false; +QString QHotkeyPrivateX11::HotkeyErrorHandler::errorString; + +QHotkeyPrivateX11::HotkeyErrorHandler::HotkeyErrorHandler() { + prevHandler = XSetErrorHandler(&HotkeyErrorHandler::handleError); +} + +QHotkeyPrivateX11::HotkeyErrorHandler::~HotkeyErrorHandler() { + XSetErrorHandler(prevHandler); + hasError = false; + errorString.clear(); +} + +int QHotkeyPrivateX11::HotkeyErrorHandler::handleError(Display *display, + XErrorEvent *error) { + switch (error->error_code) { + case BadAccess: + case BadValue: + case BadWindow: + if (error->request_code == 33 || // grab key + error->request_code == 34) { // ungrab key + hasError = true; + errorString = + QHotkeyPrivateX11::formatX11Error(display, error->error_code); + return 1; + } + Q_FALLTHROUGH(); + // fall through + default: + return 0; + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/WingTool.pro b/WingTool.pro new file mode 100644 index 0000000..666e77e --- /dev/null +++ b/WingTool.pro @@ -0,0 +1,42 @@ +QT += core gui dtkwidget + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = WingTool +TEMPLATE = app + +QT += x11extras +LIBS += -lX11 -lXext -lXtst + +SOURCES += \ + main.cpp \ + class/eventmonitor.cpp \ + QHotkey/qhotkey.cpp \ + QHotkey/qhotkey_x11.cpp \ + class/wingapplication.cpp \ + class/appmanager.cpp \ + dialog/centerwindow.cpp \ + dialog/toolwindow.cpp \ + dialog/toolboxwindow.cpp \ + class/settings.cpp \ + plugin/pluginsystem.cpp \ + class/settingmanager.cpp \ + dialog/shortcuteditdialog.cpp + +RESOURCES += resources.qrc + +HEADERS += \ + class/eventmonitor.h \ + QHotkey/qhotkey.h \ + QHotkey/qhotkey_p.h \ + class/wingapplication.h \ + class/appmanager.h \ + dialog/centerwindow.h \ + dialog/toolwindow.h \ + dialog/toolboxwindow.h \ + class/settings.h \ + plugin/pluginsystem.h \ + plugin/iwingtoolplg.h \ + class/settingmanager.h \ + dialog/shortcuteditdialog.h \ + utilies.h diff --git a/class/appmanager.cpp b/class/appmanager.cpp new file mode 100644 index 0000000..cab7b7e --- /dev/null +++ b/class/appmanager.cpp @@ -0,0 +1,117 @@ +#include "appmanager.h" +#include +#include + +AppManager *AppManager::m_instance = nullptr; + +AppManager::AppManager(QObject *parent) : QObject(parent) { + + // 初始化选词监控 + auto clipboard = qApp->clipboard(); + connect(clipboard, &QClipboard::selectionChanged, this, [=] { + // 防止过多的消息干扰 + if (!ignoremsg) { + emit this->selectionTextChanged(clipboard->text(QClipboard::Selection)); + } + }); + + // 初始化全局鼠标监控 + +#define CONNECT(sig) connect(&monitor, SIGNAL(sig), SLOT(sig)); + CONNECT(clicked); + CONNECT(doubleClicked); + CONNECT(mouseWheel); + CONNECT(mouseMove); + + connect(&monitor, &EventMonitor::buttonPress, + [=](EventMonitor::MouseButton btn, int x, int y) { + if (btn == EventMonitor::MouseButton::MiddleButton) { + toolwin.popup(QCursor::pos()); + } + emit this->buttonPress(btn, x, y); + }); + connect(&monitor, &EventMonitor::mouseDrag, [=](int x, int y) { + ignoremsg = false; + if (this->toolwin.isVisible()) + this->toolwin.sendMousePosUpdated(); + emit this->mouseDrag(x, y); + }); + connect(&monitor, &EventMonitor::buttonRelease, + [=](EventMonitor::MouseButton btn, int x, int y) { + toolwin.hide(); + ignoremsg = true; + emit this->buttonRelease(btn, x, y); + }); + + monitor.start(); + + // 初始化热键存储 + + // 存单实例 + m_instance = this; +} + +AppManager::~AppManager() { clearHotkey(); } + +AppManager *AppManager::instance() { return m_instance; } + +QHotkey *AppManager::registerHotkey(QKeySequence &keyseq) { + auto hotkey = new QHotkey(keyseq, true); + hotkeys += hotkey; + connect(hotkey, &QHotkey::activated, this, + [=] { emit this->hotkeyTirggered(hotkey, hotkeys.indexOf(hotkey)); }); + connect(hotkey, &QHotkey::released, this, + [=] { emit this->hotkeyReleased(hotkey, hotkeys.indexOf(hotkey)); }); + connect(hotkey, &QHotkey::registeredChanged, this, [=](bool registered) { + emit this->hotkeyEnableChanged(registered, hotkey, hotkeys.indexOf(hotkey)); + }); + return hotkey; +} + +bool AppManager::enableHotKey(int index, bool enabled) { + if (index < 0 || index >= hotkeys.count()) + return false; + hotkeys[index]->setRegistered(enabled); + return true; +} + +bool AppManager::unregisterHotkey(QHotkey *hotkey) { + auto i = hotkeys.indexOf(hotkey); + if (i < 0) + return false; + hotkeys.removeAt(i); + hotkey->disconnect(); + delete hotkey; + return true; +} + +bool AppManager::unregisterHotkey(int index) { + if (index < 0 || index >= hotkeys.count()) + return false; + auto del = hotkeys[index]; + del->disconnect(); + hotkeys.removeAt(index); + delete del; + return true; +} + +bool AppManager::editHotkey(int index, QKeySequence &keyseq) { + if (index < 0 || index >= hotkeys.count()) + return false; + auto del = hotkeys[index]; + del->setShortcut(keyseq, true); + return true; +} + +QHotkey *AppManager::hotkey(int index) { + if (index < 0 || index >= hotkeys.count()) + return nullptr; + return hotkeys[index]; +} + +void AppManager::clearHotkey() { + for (auto item : hotkeys) { + delete item; + } + hotkeys.clear(); +} diff --git a/class/appmanager.h b/class/appmanager.h new file mode 100644 index 0000000..71f0b87 --- /dev/null +++ b/class/appmanager.h @@ -0,0 +1,57 @@ +#ifndef APPMANAGER_H +#define APPMANAGER_H + +#include "QHotkey/qhotkey.h" +#include "class/eventmonitor.h" +#include "dialog/toolwindow.h" +#undef Bool +#undef Unsorted +#include +#include +#include + +class AppManager : public QObject { + Q_OBJECT +public: + explicit AppManager(QObject *parent = nullptr); + ~AppManager(); + + static AppManager *instance(); + +public: + QHotkey *registerHotkey(QKeySequence &keyseq); + bool enableHotKey(int index, bool enabled = true); + bool unregisterHotkey(QHotkey *hotkey); + bool unregisterHotkey(int index); + bool editHotkey(int index, QKeySequence &keyseq); + QHotkey *hotkey(int index); + void clearHotkey(); + +signals: + void buttonPress(EventMonitor::MouseButton btn, int x, int y); + void buttonRelease(EventMonitor::MouseButton btn, int x, int y); + void clicked(int x, int y); + void doubleClicked(int x, int y); + void mouseWheel(EventMonitor::MouseWheel direction); + void mouseMove(int x, int y); + void mouseDrag(int x, int y); + + void hotkeyTirggered(const QHotkey *hotkey, int index); + void hotkeyReleased(const QHotkey *hotkey, int index); + void hotkeyEnableChanged(bool value, const QHotkey *hotkey, int index); + + void selectionTextChanged(const QString &selectedText); + +private: + EventMonitor monitor; + QList hotkeys; + QList execs; + + bool ignoremsg = false; + + static AppManager *m_instance; + + ToolWindow toolwin; +}; + +#endif // APPMANAGER_H diff --git a/class/eventmonitor.cpp b/class/eventmonitor.cpp new file mode 100644 index 0000000..2c8876c --- /dev/null +++ b/class/eventmonitor.cpp @@ -0,0 +1,184 @@ +#include "eventmonitor.h" +#include +#include + +EventMonitor::EventMonitor(QObject *parent) : QThread(parent) { + isPress = false; +} + +EventMonitor::~EventMonitor() { + Display *display = XOpenDisplay(nullptr); + XRecordDisableContext(display, context); + XSync(display, 0); + wait(); + XRecordFreeContext(display, context); + XCloseDisplay(display_datalink); +} + +void EventMonitor::run() { + // Init x11 display. + Display *display = XOpenDisplay(nullptr); + if (display == nullptr) { + fprintf(stderr, "unable to open display\n"); + return; + } + + // Receive from ALL clients, including future clients. + XRecordClientSpec clients = XRecordAllClients; + XRecordRange *range = XRecordAllocRange(); + if (range == nullptr) { + fprintf(stderr, "unable to allocate XRecordRange\n"); + return; + } + + // Receive ButtonPress, ButtonRelease and MotionNotify + // events. + memset(range, 0, sizeof(XRecordRange)); + range->device_events.first = ButtonPress; + range->device_events.last = MotionNotify; + + // And create the XRECORD context. + context = XRecordCreateContext(display, 0, &clients, 1, &range, 1); + if (context == 0) { + fprintf(stderr, "XRecordCreateContext failed\n"); + return; + } + XFree(range); + + // Sync x11 display message. + XSync(display, True); + + display_datalink = XOpenDisplay(nullptr); + if (display_datalink == nullptr) { + fprintf(stderr, "unable to open second display\n"); + return; + } + + // Enter in xrecord event loop. + if (!XRecordEnableContext(display_datalink, context, callback, + reinterpret_cast(this))) { + fprintf(stderr, "XRecordEnableContext() failed\n"); + return; + } + + // init timer + clickbefore = std::chrono::system_clock::now(); + isClicked = false; +} + +void EventMonitor::callback(XPointer ptr, XRecordInterceptData *data) { + (reinterpret_cast(ptr))->handleRecordEvent(data); +} + +void EventMonitor::handleRecordEvent(XRecordInterceptData *data) { + if (data->category == XRecordFromServer) { + auto event = reinterpret_cast(data->data); + + switch (event->u.u.type) { + case ButtonPress: + if (handleWheelEvent(event->u.u.detail)) { + isPress = true; + MouseButton btn = MouseButton::NoneButton; + switch (event->u.u.detail) { + case Button1: { + btn = MouseButton::LeftButton; + + auto clicknow = std::chrono::system_clock::now(); + double diff_ms = + std::chrono::duration(clicknow - clickbefore) + .count(); + clickbefore = clicknow; + if (isClicked && diff_ms <= QApplication::doubleClickInterval()) { + emit doubleClicked(event->u.keyButtonPointer.rootX, + event->u.keyButtonPointer.rootY); + isClicked = false; + } else { + emit clicked(event->u.keyButtonPointer.rootX, + event->u.keyButtonPointer.rootY); + isClicked = true; + } + + } break; + case Button2: + btn = MouseButton::MiddleButton; + break; + case Button3: + btn = MouseButton::RightButton; + break; + case XButton1: + btn = MouseButton::XButton_1; + break; + case XButton2: + btn = MouseButton::XButton_2; + break; + } + + emit buttonPress(btn, event->u.keyButtonPointer.rootX, + event->u.keyButtonPointer.rootY); + } + break; + case MotionNotify: + if (isPress) { + emit mouseDrag(event->u.keyButtonPointer.rootX, + event->u.keyButtonPointer.rootY); + } else { + emit mouseMove(event->u.keyButtonPointer.rootX, + event->u.keyButtonPointer.rootY); + } + break; + case ButtonRelease: + if (handleWheelEvent(event->u.u.detail)) { + isPress = false; + + MouseButton btn = MouseButton::NoneButton; + switch (event->u.u.detail) { + case Button1: + btn = MouseButton::LeftButton; + break; + case Button2: + btn = MouseButton::MiddleButton; + break; + case Button3: + btn = MouseButton::RightButton; + break; + case XButton1: + btn = MouseButton::XButton_1; + break; + case XButton2: + btn = MouseButton::XButton_2; + break; + } + emit buttonRelease(btn, event->u.keyButtonPointer.rootX, + event->u.keyButtonPointer.rootY); + } + break; + default: + break; + } + } + + fflush(stdout); + XRecordFreeData(data); +} + +bool EventMonitor::handleWheelEvent(int detail) { + MouseWheel wheel = MouseWheel::None; + switch (detail) { + case WheelUp: + wheel = MouseWheel::Up; + break; + case WheelDown: + wheel = MouseWheel::Down; + break; + case WheelLeft: + wheel = MouseWheel::Left; + break; + case WheelRight: + wheel = MouseWheel::Right; + break; + default: + return true; + } + emit mouseWheel(wheel); + return false; +} diff --git a/class/eventmonitor.h b/class/eventmonitor.h new file mode 100644 index 0000000..a2a0751 --- /dev/null +++ b/class/eventmonitor.h @@ -0,0 +1,74 @@ +/***********************************************************/ +// 此代码时基于 Deepin 的取色应用进行定制修改而成,GPL 协议 +// 原来的代码无法直接进行编译,就算配置了对应的环境,本人(寂静的羽夏) +// 对此进行了大量资料的查阅修复了该问题,并做了自己的修改 +/***********************************************************/ + +#ifndef EVENTMONITOR_H +#define EVENTMONITOR_H + +#include +#include +#include +#include +#include +#include +#undef None +#include + +// Virtual button codes that are not defined by X11. +#define Button1 1 +#define Button2 2 +#define Button3 3 +#define WheelUp 4 +#define WheelDown 5 +#define WheelLeft 6 +#define WheelRight 7 +#define XButton1 8 +#define XButton2 9 + +class EventMonitor : public QThread { + Q_OBJECT + +public: + enum class MouseButton { + NoneButton, + LeftButton, + RightButton, + MiddleButton, + XButton_1, + XButton_2 + }; + Q_ENUM(MouseButton) + + enum class MouseWheel { None, Up, Down, Left, Right }; + Q_ENUM(MouseWheel) + +public: + EventMonitor(QObject *parent = nullptr); + ~EventMonitor() override; + +signals: + void buttonPress(MouseButton btn, int x, int y); // 当鼠标按键被按下时 + void buttonRelease(MouseButton btn, int x, int y); // 当鼠标按键被释放时 + void clicked(int x, int y); // 当鼠标进行单击操作时 + void doubleClicked(int x, int y); // 当鼠标进行双击操作时 + void mouseWheel(MouseWheel direction); // 当鼠标滚轮滚动时 + void mouseMove(int x, int y); // 当鼠标移动时 + void mouseDrag(int x, int y); // 当鼠标拖拽时 + +protected: + static void callback(XPointer trash, XRecordInterceptData *data); + bool handleWheelEvent(int detail); + void handleRecordEvent(XRecordInterceptData *); + void run() override; + +private: + bool isPress, isClicked; + XRecordContext context; + Display *display_datalink; + + std::chrono::system_clock::time_point clickbefore; +}; + +#endif diff --git a/class/settingmanager.cpp b/class/settingmanager.cpp new file mode 100644 index 0000000..02efa93 --- /dev/null +++ b/class/settingmanager.cpp @@ -0,0 +1,6 @@ +#include "settingmanager.h" + +SettingManager::SettingManager(QObject *parent) : QObject(parent) +{ + +} diff --git a/class/settingmanager.h b/class/settingmanager.h new file mode 100644 index 0000000..36f9bb0 --- /dev/null +++ b/class/settingmanager.h @@ -0,0 +1,14 @@ +#ifndef SETTINGMANAGER_H +#define SETTINGMANAGER_H + +#include + +class SettingManager : public QObject { + Q_OBJECT +public: + explicit SettingManager(QObject *parent = nullptr); + +private: +}; + +#endif // SETTINGMANAGER_H diff --git a/class/settings.cpp b/class/settings.cpp new file mode 100644 index 0000000..27ddf83 --- /dev/null +++ b/class/settings.cpp @@ -0,0 +1,6 @@ +#include "settings.h" + +Settings::Settings() +{ + +} diff --git a/class/settings.h b/class/settings.h new file mode 100644 index 0000000..9cd2454 --- /dev/null +++ b/class/settings.h @@ -0,0 +1,11 @@ +#ifndef SETTINGS_H +#define SETTINGS_H + + +class Settings +{ +public: + Settings(); +}; + +#endif // SETTINGS_H diff --git a/class/wingapplication.cpp b/class/wingapplication.cpp new file mode 100644 index 0000000..cacff99 --- /dev/null +++ b/class/wingapplication.cpp @@ -0,0 +1,69 @@ +#include "wingapplication.h" +#include +#include +#include +#include +#include +#include + +WingApplication::WingApplication(int &argc, char **argv) + : DApplication(argc, argv) {} + +bool WingApplication::notify(QObject *obj, QEvent *event) { + bool done = true; + try { + done = QApplication::notify(obj, event); + } catch (const QUnhandledException &ex) { + auto p = this->applicationDirPath(); + auto errlog = "errlog"; + QDir dir(p); + dir.mkdir(errlog); + dir.cd(errlog); + auto time = QDateTime::currentDateTimeUtc(); + auto ferrname = QString::number(time.currentSecsSinceEpoch(), 16) + ".log"; + QFile log(dir.absolutePath() + "/" + ferrname); + if (log.open(QFile::WriteOnly)) { + log.write(ex.what()); + log.close(); + } else { + log.setFileName( + QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/" + + ferrname); + if (log.open(QFile::WriteOnly)) { + log.write(ex.what()); + log.close(); + } else { + QMessageBox::critical(nullptr, tr("Error"), + tr("WriteErrorLogError") + ferrname); + QMessageBox::information(nullptr, tr("Crash"), ex.what()); + } + } + } catch (const QException &ex) { + auto p = this->applicationDirPath(); + auto errlog = "errlog"; + QDir dir(p); + dir.mkdir(errlog); + dir.cd(errlog); + auto time = QDateTime::currentDateTimeUtc(); + auto ferrname = QString::number(time.currentSecsSinceEpoch(), 16) + ".log"; + QFile log(dir.absolutePath() + "/" + ferrname); + if (log.open(QFile::WriteOnly)) { + log.write(ex.what()); + log.close(); + } else { + log.setFileName( + QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/" + + ferrname); + if (log.open(QFile::WriteOnly)) { + log.write(ex.what()); + log.close(); + } else { + QMessageBox::critical(nullptr, tr("Error"), + tr("WriteErrorLogError") + ferrname); + QMessageBox::information(nullptr, tr("Crash"), ex.what()); + } + } + } catch (...) { + } + return done; +} diff --git a/class/wingapplication.h b/class/wingapplication.h new file mode 100644 index 0000000..4b87931 --- /dev/null +++ b/class/wingapplication.h @@ -0,0 +1,16 @@ +#ifndef WINGAPPLICATION_H +#define WINGAPPLICATION_H + +#include + +DWIDGET_USE_NAMESPACE + +class WingApplication : public DApplication { +public: + WingApplication(int &argc, char **argv); + +private: + bool notify(QObject *obj, QEvent *event) override; +}; + +#endif // WINGAPPLICATION_H diff --git a/dialog/centerwindow.cpp b/dialog/centerwindow.cpp new file mode 100644 index 0000000..d2cb97a --- /dev/null +++ b/dialog/centerwindow.cpp @@ -0,0 +1,301 @@ +#include "centerwindow.h" +#include "shortcuteditdialog.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +CenterWindow::CenterWindow(DMainWindow *parent) + : DMainWindow(parent), manager(AppManager::instance()) { + QIcon picon = ProgramIcon; + setWindowTitle(tr("CenterWindow")); + setMinimumSize(700, 500); + setWindowIcon(picon); + + auto title = titlebar(); + title->setTitle(tr("CenterWindow")); + title->setIcon(picon); + + tabs = new DTabWidget(this); + setCentralWidget(tabs); + + // General + auto w = new QWidget(this); + auto vlayout = new QVBoxLayout(w); + cbauto = new DCheckBox(tr("AutoStart"), this); + vlayout->setMargin(20); + vlayout->addWidget(cbauto, Qt::AlignTop); + vlayout->addStretch(); + tabs->addTab(w, tr("General")); + + // Hotkeys + w = new QWidget(this); + vlayout = new QVBoxLayout(w); + auto group = new DButtonBox(this); + vlayout->setMargin(20); + QList blist; + auto b = new DButtonBoxButton(tr("Add"), this); + connect(b, &DButtonBoxButton::clicked, this, &CenterWindow::on_addHotkey); + blist.append(b); + b = new DButtonBoxButton(tr("Remove"), this); + connect(b, &DButtonBoxButton::clicked, this, &CenterWindow::on_removeHotkey); + blist.append(b); + b = new DButtonBoxButton(tr("Edit"), this); + connect(b, &DButtonBoxButton::clicked, this, &CenterWindow::on_editHotkey); + blist.append(b); + b = new DButtonBoxButton(tr("Clear"), this); + connect(b, &DButtonBoxButton::clicked, this, &CenterWindow::on_clearHotkey); + blist.append(b); + group->setButtonList(blist, false); + vlayout->addWidget(group, Qt::AlignTop); + vlayout->addSpacing(10); + + tbhotkeys = new DTableWidget(this); + tbhotkeys->setEditTriggers(DTableWidget::EditTrigger::NoEditTriggers); + tbhotkeys->setSelectionBehavior(QAbstractItemView::SelectRows); + tbhotkeys->setSelectionMode(QAbstractItemView::ExtendedSelection); + tbhotkeys->setColumnCount(4); + tbhotkeys->setHorizontalHeaderLabels( + {tr("Enable"), tr("HotKey"), tr("Exec"), tr("Params")}); + tbhotkeys->setCornerButtonEnabled(true); + tbhotkeys->horizontalHeader()->setStretchLastSection(true); + + auto *menu = new DMenu(tbhotkeys); + QAction *a; + +#define AddMenuAction(title, slot) \ + a = new QAction(title, menu); \ + connect(a, &QAction::triggered, this, slot); \ + menu->addAction(a); + + AddMenuAction(tr("Enable"), [=] { this->enableSelectedHotkeys(true); }); + hkcmenu.append(a); + AddMenuAction(tr("Disable"), [=] { this->enableSelectedHotkeys(false); }); + hkcmenu.append(a); + menu->addSeparator(); + AddMenuAction(tr("Add"), &CenterWindow::on_addHotkey); + AddMenuAction(tr("Edit"), &CenterWindow::on_editHotkey); + hkcmenu.append(a); + AddMenuAction(tr("Remove"), &CenterWindow::on_removeHotkey); + hkcmenu.append(a); + AddMenuAction(tr("Clear"), &CenterWindow::on_clearHotkey); + + tbhotkeys->setContextMenuPolicy(Qt::CustomContextMenu); + connect(tbhotkeys, &DTabWidget::customContextMenuRequested, this, [=] { + auto flag = tbhotkeys->currentRow() >= 0; + for (auto item : hkcmenu) { + item->setEnabled(flag); + } + menu->popup(QCursor::pos()); + }); + connect(tbhotkeys, &DTableWidget::cellClicked, this, [=](int row, int) { + if (row < 0 || row >= scinfos.count()) + return; + auto b = tbhotkeys->item(row, 0)->checkState() == Qt::Checked; + scinfos[row].enabled = b; + manager->enableHotKey(row, b); + }); + connect(tbhotkeys, &DTableWidget::cellDoubleClicked, this, + [=](int row, int) { this->editTask(row); }); + + vlayout->addWidget(tbhotkeys); + tabs->addTab(w, tr("Hotkeys")); + + // ToolBox + w = new QWidget(this); + + tabs->addTab(w, tr("ToolBox")); + + // Plugins + w = new QWidget(this); + auto playout = new QHBoxLayout(w); + lwplgs = new DListWidget(w); + playout->addWidget(lwplgs); + tbplginfo = new DTextBrowser(w); + playout->addWidget(tbplginfo); + tabs->addTab(w, tr("Plugins")); + + // AboutAuthor + w = new QWidget(this); + auto alayout = new QVBoxLayout(w); + auto l = new DLabel(this); + l->setFixedSize(100, 100); + l->setScaledContents(true); + l->setPixmap(QPixmap(":/images/author.jpg")); + alayout->addWidget(l); + alayout->addSpacing(10); + alayout->addWidget(l, 0, Qt::AlignCenter); + + auto tb = new DTextBrowser(this); + tb->setSearchPaths(QStringList({":/", ":/images"})); + tb->setSource(QUrl("README.md"), QTextDocument::MarkdownResource); + tb->setOpenExternalLinks(true); + alayout->addWidget(tb); + + tabs->addTab(w, tr("About")); + + // Sponsor + w = new QWidget(this); + auto slayout = new QVBoxLayout(w); + slayout->addWidget(new DLabel(tr("ThanksForSponsor"), this), 0, + Qt::AlignCenter); + slayout->addSpacing(5); + + l = new DLabel(this); + l->setPixmap(QPixmap(":/sponsor.png")); + l->setScaledContents(true); + slayout->addWidget(l); + tabs->addTab(w, tr("Sponsor")); + + //初始化热键事件处理函数 + QObject::connect(manager, &AppManager::hotkeyTirggered, this, + [=](const QHotkey *, int index) { + auto &task = scinfos[index]; + this->runTask(task.process, task.params); + }); + QObject::connect(manager, &AppManager::hotkeyReleased, this, + [=](const QHotkey *, int) { + + }); + QObject::connect(manager, &AppManager::hotkeyEnableChanged, this, + [=](bool value, const QHotkey *, int index) { + tbhotkeys->item(index, 0)->setCheckState( + value ? Qt::Checked : Qt::Unchecked); + }); +} + +QStringList CenterWindow::parseCmdParams(QString str) { + static QRegularExpression regex("(\"[^\"]+\"|[^\\s\"]+)"); + QStringList args; + int off = 0; + while (true) { + auto match = regex.match(str, off); + if (!match.hasMatch()) { + break; + } + auto res = match.captured(); + if (res[0] == '\"') + res = res.replace("\"", ""); + if (res[0] == '\'') + res = res.replace("'", ""); + args << res; + off = match.capturedEnd(); + } + return args; +} + +bool CenterWindow::runTask(QString program, QString param) { + QMimeDatabase db; + + QFileInfo info(program); + auto absp = info.absoluteFilePath(); + + auto mt = db.mimeTypeForFile(absp); + auto n = mt.name(); + if (n == "application/x-executable") { + if (!pstart.startDetached(absp, parseCmdParams(param))) { + DMessageBox::critical(this, tr("runErr"), pstart.errorString()); + return false; + } + } else { + if (!QDesktopServices::openUrl(QUrl("file://" + absp))) { + DMessageBox::critical(this, tr("err"), tr("openErr")); + return false; + } + } + return true; +} + +void CenterWindow::editTask(int index) { + if (index < 0 || index >= scinfos.count()) + return; + auto &task = scinfos[index]; + ShortCutEditDialog d(task.enabled, task.seq, task.process, task.params); + if (d.exec()) { + auto res = d.getResult(); + auto wt = new QTableWidgetItem; + wt->setCheckState(res.enabled ? Qt::Checked : Qt::Unchecked); + tbhotkeys->setItem(index, 0, wt); + tbhotkeys->setItem(index, 1, new QTableWidgetItem(res.seq.toString())); + wt = new QTableWidgetItem(res.process); + wt->setToolTip(res.process); + tbhotkeys->setItem(index, 2, wt); + wt = new QTableWidgetItem(res.params); + wt->setToolTip(res.params); + tbhotkeys->setItem(index, 3, wt); + + task = res; + manager->editHotkey(index, res.seq); + } +} + +void CenterWindow::on_editHotkey() { this->editTask(tbhotkeys->currentRow()); } + +void CenterWindow::on_removeHotkey() { + auto selrows = tbhotkeys->selectionModel()->selectedRows(); + if (!selrows.length()) + return; + if (selrows.length() > 1) { + QVector nums; + for (auto &item : selrows) + nums.append(item.row()); + std::sort(nums.begin(), nums.end(), std::greater()); + for (auto item : nums) { + scinfos.removeAt(item); + manager->unregisterHotkey(item); + tbhotkeys->removeRow(item); + } + } else { + auto row = tbhotkeys->currentRow(); + scinfos.removeAt(row); + manager->unregisterHotkey(row); + tbhotkeys->removeRow(row); + } +} + +void CenterWindow::on_clearHotkey() { + scinfos.clear(); + manager->clearHotkey(); + tbhotkeys->setRowCount(0); + DMessageManager::instance()->sendMessage(this, ProgramIcon, + tr("ClearSuccess")); +} + +void CenterWindow::on_addHotkey() { + ShortCutEditDialog d; + if (d.exec()) { + auto res = d.getResult(); + auto index = tbhotkeys->rowCount(); + tbhotkeys->setRowCount(index + 1); + auto wt = new QTableWidgetItem; + wt->setCheckState(res.enabled ? Qt::Checked : Qt::Unchecked); + tbhotkeys->setItem(index, 0, wt); + tbhotkeys->setItem(index, 1, new QTableWidgetItem(res.seq.toString())); + wt = new QTableWidgetItem(res.process); + wt->setToolTip(res.process); + tbhotkeys->setItem(index, 2, wt); + wt = new QTableWidgetItem(res.params); + wt->setToolTip(res.params); + tbhotkeys->setItem(index, 3, wt); + + scinfos.append(res); + manager->registerHotkey(res.seq); + } +} + +void CenterWindow::enableSelectedHotkeys(bool enable) { + auto selrows = tbhotkeys->selectionModel()->selectedRows(); + for (auto &item : selrows) { + manager->enableHotKey(item.row(), enable); + } +} diff --git a/dialog/centerwindow.h b/dialog/centerwindow.h new file mode 100644 index 0000000..a6e348d --- /dev/null +++ b/dialog/centerwindow.h @@ -0,0 +1,57 @@ +#ifndef CENTERWINDOW_H +#define CENTERWINDOW_H + +#include "class/appmanager.h" +#include "utilies.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +class CenterWindow : public DMainWindow { + Q_OBJECT +public: + CenterWindow(DMainWindow *parent = nullptr); + +private: + QStringList parseCmdParams(QString str); + bool runTask(QString program, QString param); + void editTask(int index); + + void on_editHotkey(); + void on_removeHotkey(); + void on_clearHotkey(); + void on_addHotkey(); + void enableSelectedHotkeys(bool enable); + +private: + QList hkcmenu; + +private: + AppManager *manager; + + DTabWidget *tabs; + + DTableWidget *tbhotkeys; + DMenu *tbmenu; + + DListWidget *lwplgs; + DTextBrowser *tbplginfo; + + DCheckBox *cbauto; // 开机自启动 + + QProcess pstart; + +private: + QList scinfos; +}; + +#endif // CENTERWINDOW_H diff --git a/dialog/shortcuteditdialog.cpp b/dialog/shortcuteditdialog.cpp new file mode 100644 index 0000000..8c8b811 --- /dev/null +++ b/dialog/shortcuteditdialog.cpp @@ -0,0 +1,91 @@ +#include "shortcuteditdialog.h" +#include +#include +#include +#include + +ShortCutEditDialog::ShortCutEditDialog(bool enabled, QKeySequence seq, + QString process, QString params, + DMainWindow *parent) + : DDialog(parent), manager(AppManager::instance()) { + + // 处于编辑状态直接堵塞所有相应(屏蔽鼠标追踪和热键触发以防干扰) + manager->blockSignals(true); + + setWindowTitle(tr("HotkeyEdit")); + + cb = new DCheckBox(tr("Enabled"), this); + cb->setChecked(enabled); + addContent(cb); + addSpacing(10); + + addContent(new DLabel(tr("ShortCut"), this)); + addSpacing(5); + ksedit = new DKeySequenceEdit(this); + ksedit->setKeySequence(seq); + addContent(ksedit); + addSpacing(10); + + addContent(new DLabel(tr("FilePath"), this)); + addSpacing(5); + fcedit = new DFileChooserEdit(this); + fcedit->initDialog(); + fcedit->setText(process); + addContent(fcedit); + addSpacing(10); + + addContent(new DLabel(tr("Param"), this)); + addSpacing(5); + dledit = new DLineEdit(this); + dledit->setText(params); + addContent(dledit); + + addSpacing(20); + auto dbbox = new DDialogButtonBox( + DDialogButtonBox::Ok | DDialogButtonBox::Cancel, this); + connect(dbbox, &DDialogButtonBox::accepted, this, + &ShortCutEditDialog::on_accept); + connect(dbbox, &DDialogButtonBox::rejected, this, + &ShortCutEditDialog::on_reject); + auto key = QKeySequence(Qt::Key_Return); + auto s = new QShortcut(key, this); + connect(s, &QShortcut::activated, this, &ShortCutEditDialog::on_accept); + addContent(dbbox); +} + +ShortCutEditRes ShortCutEditDialog::getResult() { return res; } + +void ShortCutEditDialog::on_accept() { + res.enabled = cb->isChecked(); + res.seq = ksedit->keySequence(); + + if (res.seq == QKeySequence()) { + DMessageManager::instance()->sendMessage(this, ProgramIcon, + tr("NoHotkeySet")); + return; + } + + res.process = fcedit->text(); + + if (res.process.isEmpty()) { + DMessageManager::instance()->sendMessage(this, ProgramIcon, + tr("NoProcessSet")); + return; + } + + res.params = dledit->text(); + + manager->blockSignals(false); // 恢复能力 + done(1); +} + +void ShortCutEditDialog::on_reject() { + manager->blockSignals(false); // 恢复能力 + done(0); +} + +void ShortCutEditDialog::closeEvent(QCloseEvent *event) { + Q_UNUSED(event); + manager->blockSignals(false); // 恢复能力 + done(0); +} diff --git a/dialog/shortcuteditdialog.h b/dialog/shortcuteditdialog.h new file mode 100644 index 0000000..6a2f9be --- /dev/null +++ b/dialog/shortcuteditdialog.h @@ -0,0 +1,40 @@ +#ifndef SHORTCUTEDITDIALOG_H +#define SHORTCUTEDITDIALOG_H + +#include "utilies.h" + +#include "class/appmanager.h" +#include +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +class ShortCutEditDialog : public DDialog { +public: + ShortCutEditDialog(bool enabled = true, QKeySequence seq = QKeySequence(), + QString process = QString(), QString params = QString(), + DMainWindow *parent = nullptr); + ShortCutEditRes getResult(); + +private: + void on_accept(); + void on_reject(); + +protected: + void closeEvent(QCloseEvent *event) override; + +private: + AppManager *manager; + + ShortCutEditRes res; + DCheckBox *cb; + DFileChooserEdit *fcedit; + DLineEdit *dledit; + DKeySequenceEdit *ksedit; +}; + +#endif // SHORTCUTEDITDIALOG_H diff --git a/dialog/toolboxwindow.cpp b/dialog/toolboxwindow.cpp new file mode 100644 index 0000000..46dae4c --- /dev/null +++ b/dialog/toolboxwindow.cpp @@ -0,0 +1,6 @@ +#include "toolboxwindow.h" + +ToolBoxWindow::ToolBoxWindow() +{ + +} diff --git a/dialog/toolboxwindow.h b/dialog/toolboxwindow.h new file mode 100644 index 0000000..0ff61fb --- /dev/null +++ b/dialog/toolboxwindow.h @@ -0,0 +1,11 @@ +#ifndef TOOLBOXWINDOW_H +#define TOOLBOXWINDOW_H + + +class ToolBoxWindow +{ +public: + ToolBoxWindow(); +}; + +#endif // TOOLBOXWINDOW_H \ No newline at end of file diff --git a/dialog/toolwindow.cpp b/dialog/toolwindow.cpp new file mode 100644 index 0000000..350315e --- /dev/null +++ b/dialog/toolwindow.cpp @@ -0,0 +1,66 @@ +#include "toolwindow.h" +#include "utilies.h" +#include + +#define GridSize 40 +#define GridTotal (GridSize * 3) + +ToolWindow::ToolWindow(DDialog *parent) : DDialog(parent) { + + setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | + Qt::X11BypassWindowManagerHint); + setWindowFlag(Qt::FramelessWindowHint); + setFixedSize(GridTotal, GridTotal); + delete layout(); + + mlayout = new QGridLayout(this); + setLayout(mlayout); + mlayout->setMargin(1); + + for (int i = 0; i < 9; i++) { + auto lbl = new DIconButton(this); + lbl->setFixedSize(GridSize - 2, GridSize - 2); + lbl->setIconSize(QSize(GridSize / 2, GridSize / 2)); + auto in = std::div(i, 3); + mlayout->addWidget(lbl, in.quot, in.rem, Qt::AlignCenter); + lbls[i] = lbl; + } + + lbls[4]->setIcon(ICONRES("close")); +} + +void ToolWindow::setIcons(QVector icons) { + if (icons.count() != 8) + return; + for (int i = 0; i < 9; i++) { + if (i == 4) + continue; + if (i < 4) { + lbls[i]->setIcon(icons[i]); + } else { + lbls[i]->setIcon(icons[i - 1]); + } + } +} + +void ToolWindow::setIcon(int index, QIcon icon) { + // index 取值 0-8 ,但是索引 4 被保留不做处理,是正中间的按钮 + if (index < 0 || index == 4 || index > 8) + return; + lbls[index]->setIcon(icon); +} + +void ToolWindow::popup(QPoint pos) { + this->move(pos.x() - GridTotal / 2, pos.y() - GridTotal / 2); + show(); + setFocus(); +} + +void ToolWindow::sendMousePosUpdated() { + for (int x = 0; x < 3; x++) { + for (int y = 0; y < 3; y++) { + lbls[x * 3 + y]->setDown( + mlayout->cellRect(x, y).contains(mapFromGlobal(QCursor::pos()))); + } + } +} diff --git a/dialog/toolwindow.h b/dialog/toolwindow.h new file mode 100644 index 0000000..0f41f84 --- /dev/null +++ b/dialog/toolwindow.h @@ -0,0 +1,31 @@ +#ifndef TOOLWINDOW_H +#define TOOLWINDOW_H + +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +class ToolWindow : public DDialog { + Q_OBJECT +public: + ToolWindow(DDialog *parent = nullptr); + +public slots: + void setIcons(QVector icons); + void setIcon(int index, QIcon icon); + + void popup(QPoint pos); + + // 这个函数是用来提供 UI 鼠标交互和选择情况的,mouseMoveEvent 不触发就挺烦 + // 最后只能用自己封装好的鼠标 Hook 进行通知 + void sendMousePosUpdated(); + +private: + QGridLayout *mlayout; + DIconButton *lbls[9] = {nullptr}; +}; + +#endif // TOOLWINDOW_H diff --git a/images/author.jpg b/images/author.jpg new file mode 100755 index 0000000000000000000000000000000000000000..7e66131af13f7d8a453fe508b224c75cbcade313 GIT binary patch literal 50128 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

acwA4KGlZ44> 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 literal 0 HcmV?d00001 diff --git a/images/close.png b/images/close.png new file mode 100755 index 0000000000000000000000000000000000000000..f424e3ff99a2b2d4d1aad67c51bb6e008a4c179d GIT binary patch literal 6363 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 Yv9G_GZo!Vi{H*}UNhu>LB#Z<83)F+{IRF3v literal 0 HcmV?d00001 diff --git a/images/logo.svg b/images/logo.svg new file mode 100644 index 0000000..d616e67 --- /dev/null +++ b/images/logo.svg @@ -0,0 +1,54 @@ + + + + + + + + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..0235f92 --- /dev/null +++ b/main.cpp @@ -0,0 +1,96 @@ +#include "class/appmanager.h" +#include "class/wingapplication.h" +#include "dialog/centerwindow.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE + +int main(int argc, char *argv[]) { + //解决 root/ubuntu 主题样式走形 + qputenv("XDG_CURRENT_DESKTOP", "Deepin"); + QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); + + // 程序内强制添加 -platformtheme + // deepin 参数喂给 Qt 让 Qt 正确使用 Deepin 主题修复各种奇怪样式问题 + QVector fakeArgs(argc + 2); + char fa1[] = "-platformtheme"; + char fa2[] = "deepin"; + fakeArgs[0] = argv[0]; + fakeArgs[1] = fa1; + fakeArgs[2] = fa2; + + for (int i = 1; i < argc; i++) + fakeArgs[i + 2] = argv[i]; + int fakeArgc = argc + 2; + + WingApplication a(fakeArgc, fakeArgs.data()); + QCoreApplication::setAttribute(Qt::AA_UseOpenGLES); + + // auto s = a.applicationDirPath() + "/lang/default.qm"; + // QTranslator translator; + // if (!translator.load(s)) { + // DMessageBox::critical(nullptr, "Error", "Error Loading Translation + // File!", + // DMessageBox::Ok); + // return -1; + // } + // a.installTranslator(&translator); + + a.setOrganizationName("WingCloud"); + a.setApplicationName(QObject::tr("WingTool")); + a.setApplicationVersion("1.0.0"); + + QIcon picon(":/images/logo.svg"); + a.setProductIcon(picon); + a.setProductName(QObject::tr("WingHexExplorer")); + a.setApplicationDescription("This is a dtk template application."); + + a.loadTranslator(); + a.setApplicationDisplayName("WingTool"); + + if (!a.setSingleInstance("com.Wingsummer.WingTool")) { + return -1; + } + + // 单例传参 + auto instance = DGuiApplicationHelper::instance(); + QObject::connect(instance, &DGuiApplicationHelper::newProcessInstance, + [=](qint64 pid, const QStringList &arguments) { + Q_UNUSED(pid); + Q_UNUSED(arguments); + }); + + // 保存程序的窗口主题设置 + DApplicationSettings as; + Q_UNUSED(as) + + // 初始化程序基础驱动 + AppManager manger; + + CenterWindow w; + + // 初始化托盘 + QSystemTrayIcon systray; + QMenu sysmenu; + systray.setContextMenu(&sysmenu); + systray.setIcon(picon); + systray.show(); + + QObject::connect(&systray, &QSystemTrayIcon::activated, + [&w](QSystemTrayIcon::ActivationReason reason) { + if (reason == QSystemTrayIcon::ActivationReason::Trigger) + w.show(); + }); + + Dtk::Widget::moveToCenter(&w); + + return a.exec(); +} diff --git a/plugin/iwingtoolplg.h b/plugin/iwingtoolplg.h new file mode 100644 index 0000000..7ed3a99 --- /dev/null +++ b/plugin/iwingtoolplg.h @@ -0,0 +1,106 @@ +#ifndef IWINGTOOLPLG_H +#define IWINGTOOLPLG_H + +#include +#include + +#define SDKVERSION 0 +#define GETPLUGINQM(name) \ + (QCoreApplication::applicationDirPath() + "/plglang/" + name) +#define PLUGINDIR (QCoreApplication::applicationDirPath() + "/plugin") + +#define WINGSUMMER "wingsummer" + +struct WingPluginInfo { + QString pluginName; + QString pluginAuthor; + uint pluginVersion; + QString puid; + QString pluginComment; +}; + +enum class MouseButton { + NoneButton, + LeftButton, + RightButton, + MiddleButton, + XButton_1, + XButton_2 +}; +Q_DECLARE_METATYPE(MouseButton) + +enum class MouseWheel { None, Up, Down, Left, Right }; +Q_DECLARE_METATYPE(MouseWheel) + +class IWingToolPlg : public QObject { + Q_OBJECT +public: + virtual int sdkVersion() = 0; + virtual QString signature() = 0; + QByteArray puid() { return GetPUID(this); } + virtual ~IWingToolPlg() {} + + virtual bool init(QList loadedplugin) = 0; + virtual void unload() = 0; + virtual QString pluginName() = 0; + virtual QString pluginAuthor() = 0; + virtual uint pluginVersion() = 0; + virtual QString pluginComment() = 0; + + static QByteArray GetPUID(IWingToolPlg *plugin) { + auto str = QString("%1%2%3%4") + .arg(WINGSUMMER) + .arg(plugin->pluginName()) + .arg(plugin->pluginAuthor()) + .arg(plugin->pluginVersion()); + return QCryptographicHash::hash(str.toLatin1(), QCryptographicHash::Md5); + } + + virtual QIcon pluginIcon() = 0; + +signals: + bool registerHotkey(QKeySequence &keyseq); + bool enableHotKey(int index, bool enabled = true); + bool unregisterHotkey(int index); + +public slots: + virtual void buttonPress(MouseButton btn, int x, int y) { + Q_UNUSED(btn); + Q_UNUSED(x); + Q_UNUSED(y); + } + virtual void buttonRelease(MouseButton btn, int x, int y) { + Q_UNUSED(btn); + Q_UNUSED(x); + Q_UNUSED(y); + } + virtual void clicked(int x, int y) { + Q_UNUSED(x); + Q_UNUSED(y); + } + virtual void doubleClicked(int x, int y) { + Q_UNUSED(x); + Q_UNUSED(y); + } + virtual void mouseWheel(MouseWheel direction) { Q_UNUSED(direction); } + virtual void mouseMove(int x, int y) { + Q_UNUSED(x); + Q_UNUSED(y); + } + + virtual void hotkeyTirggered(int index) { Q_UNUSED(index); } + virtual void hotkeyReleased(int index) { Q_UNUSED(index); } + virtual void hotkeyEnableChanged(bool value, int index) { + Q_UNUSED(value); + Q_UNUSED(index); + } + + virtual void selectionTextChanged(const QString &selectedText) { + Q_UNUSED(selectedText); + } +}; + +#define IWINGPLUGIN_INTERFACE_IID "com.wingsummer.iwingplugin" +Q_DECLARE_INTERFACE(WingPluginInfo, IWINGPLUGIN_INTERFACE_IID) + +#endif // IWINGTOOLPLG_H diff --git a/plugin/pluginsystem.cpp b/plugin/pluginsystem.cpp new file mode 100644 index 0000000..9270cbe --- /dev/null +++ b/plugin/pluginsystem.cpp @@ -0,0 +1,9 @@ +#include "pluginsystem.h" + +PluginSystem::PluginSystem(QObject *parent) : QObject(parent) {} + +PluginSystem::~PluginSystem() {} + +bool PluginSystem::LoadPlugin() {} + +void PluginSystem::UnloadPlugin() {} diff --git a/plugin/pluginsystem.h b/plugin/pluginsystem.h new file mode 100644 index 0000000..c4d3873 --- /dev/null +++ b/plugin/pluginsystem.h @@ -0,0 +1,35 @@ +#ifndef PLUGINSYSTEM_H +#define PLUGINSYSTEM_H + +#include "iwingtoolplg.h" +#include +#include + +class PluginSystem : public QObject { + Q_OBJECT +public: + enum class LP { + begin, + signature, + sdkVersion, + pluginName, + puid, + plugin2MessagePipe, + init, + }; + Q_ENUM(LP) + +public: + explicit PluginSystem(QObject *parent = nullptr); + + ~PluginSystem(); + bool LoadPlugin(); + void UnloadPlugin(); + + QList plugins(); + + void loadPlugin(QFileInfo filename); + IWingToolPlg *currentControlPlugin(); +}; + +#endif // PLUGINSYSTEM_H diff --git a/resources.qrc b/resources.qrc new file mode 100644 index 0000000..82b8ee8 --- /dev/null +++ b/resources.qrc @@ -0,0 +1,8 @@ + + + images/logo.svg + sponsor.png + images/author.jpg + images/close.png + + diff --git a/sponsor.png b/sponsor.png new file mode 100644 index 0000000000000000000000000000000000000000..41829c9a9cde34e2d5973bbf2146fb799f7db019 GIT binary patch literal 794217 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�hNQlO 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 literal 0 HcmV?d00001 diff --git a/utilies.h b/utilies.h new file mode 100644 index 0000000..bd97a36 --- /dev/null +++ b/utilies.h @@ -0,0 +1,17 @@ +#ifndef UTILIES_H +#define UTILIES_H + +#include +#include + +#define ProgramIcon QIcon(":/images/logo.svg") +#define ICONRES(name) QIcon(":/images/" name ".png") + +struct ShortCutEditRes { + bool enabled; + QKeySequence seq; + QString process; + QString params; +}; + +#endif // UTILIES_H