From 0ae1adeb321a7902cc7c0f9517ba549248ea3d74 Mon Sep 17 00:00:00 2001 From: cialloo Date: Sat, 20 Jul 2024 12:45:47 +0800 Subject: [PATCH] feat: Initial commit --- .gitignore | 46 ++ .metadata | 30 + LICENSE | 674 ++++++++++++++++++ README.md | 3 + analysis_options.yaml | 4 + lib/about_page.dart | 64 ++ lib/application_exit_control.dart | 67 ++ lib/control_page.dart | 442 ++++++++++++ lib/edge_state.dart | 20 + lib/home_page.dart | 97 +++ lib/logger_page.dart | 22 + lib/main.dart | 77 ++ lib/saved_connection.dart | 27 + lib/setting_page.dart | 48 ++ lib/shared_pref_singleton.dart | 22 + pubspec.lock | 418 +++++++++++ pubspec.yaml | 22 + windows/.gitignore | 17 + windows/CMakeLists.txt | 115 +++ windows/flutter/CMakeLists.txt | 109 +++ .../flutter/generated_plugin_registrant.cc | 20 + windows/flutter/generated_plugin_registrant.h | 15 + windows/flutter/generated_plugins.cmake | 26 + windows/runner/CMakeLists.txt | 42 ++ windows/runner/Runner.rc | 121 ++++ windows/runner/flutter_window.cpp | 71 ++ windows/runner/flutter_window.h | 33 + windows/runner/main.cpp | 43 ++ windows/runner/resource.h | 16 + windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes windows/runner/runner.exe.manifest | 20 + windows/runner/utils.cpp | 65 ++ windows/runner/utils.h | 19 + windows/runner/win32_window.cpp | 288 ++++++++ windows/runner/win32_window.h | 102 +++ windows/tools/driver/OemVista.inf | 195 +++++ windows/tools/driver/devcon.exe | Bin 0 -> 116216 bytes windows/tools/driver/tap0901.cat | Bin 0 -> 11882 bytes windows/tools/driver/tap0901.sys | Bin 0 -> 41000 bytes windows/tools/edge/edge.exe | Bin 0 -> 207360 bytes 40 files changed, 3400 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 LICENSE create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 lib/about_page.dart create mode 100644 lib/application_exit_control.dart create mode 100644 lib/control_page.dart create mode 100644 lib/edge_state.dart create mode 100644 lib/home_page.dart create mode 100644 lib/logger_page.dart create mode 100644 lib/main.dart create mode 100644 lib/saved_connection.dart create mode 100644 lib/setting_page.dart create mode 100644 lib/shared_pref_singleton.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 windows/.gitignore create mode 100644 windows/CMakeLists.txt create mode 100644 windows/flutter/CMakeLists.txt create mode 100644 windows/flutter/generated_plugin_registrant.cc create mode 100644 windows/flutter/generated_plugin_registrant.h create mode 100644 windows/flutter/generated_plugins.cmake create mode 100644 windows/runner/CMakeLists.txt create mode 100644 windows/runner/Runner.rc create mode 100644 windows/runner/flutter_window.cpp create mode 100644 windows/runner/flutter_window.h create mode 100644 windows/runner/main.cpp create mode 100644 windows/runner/resource.h create mode 100644 windows/runner/resources/app_icon.ico create mode 100644 windows/runner/runner.exe.manifest create mode 100644 windows/runner/utils.cpp create mode 100644 windows/runner/utils.h create mode 100644 windows/runner/win32_window.cpp create mode 100644 windows/runner/win32_window.h create mode 100644 windows/tools/driver/OemVista.inf create mode 100644 windows/tools/driver/devcon.exe create mode 100644 windows/tools/driver/tap0901.cat create mode 100644 windows/tools/driver/tap0901.sys create mode 100644 windows/tools/edge/edge.exe diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9465d9c --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release + +# Custom +/tools/ diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..ef8804a --- /dev/null +++ b/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + - platform: windows + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..aef4e4c --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# winui_n2n + +A new Flutter project. diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..d81e087 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,4 @@ +analyzer: + errors: + library_private_types_in_public_api: ignore +include: package:flutter_lints/flutter.yaml diff --git a/lib/about_page.dart b/lib/about_page.dart new file mode 100644 index 0000000..85ee6c6 --- /dev/null +++ b/lib/about_page.dart @@ -0,0 +1,64 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class AboutPage extends StatelessWidget { + const AboutPage({super.key}); + + @override + Widget build(BuildContext context) { + TextStyle defaultStyle = const TextStyle(fontSize: 16.0); + TextStyle linkStyle = const TextStyle(color: Colors.blue); + return Center( + child: SelectableText.rich( + TextSpan( + style: defaultStyle, + children: [ + const TextSpan( + text: '项目基于 n2n , 一款优秀的跨平台开源p2p VPN软件\n', + ), + const TextSpan( + text: 'winui_n2n软件开源地址 ', + ), + TextSpan( + text: 'https://github.com/moemoequte/winui_n2n\n', + style: linkStyle, + recognizer: TapGestureRecognizer() + ..onTap = () { + launchUrl( + Uri.parse('https://github.com/moemoequte/winui_n2n')); + }, + ), + const TextSpan( + text: '分发和使用请遵循 GPL-3.0 license 开源协议\n\n', + ), + const TextSpan( + text: '作者信息\n', + ), + const TextSpan(text: '网站 '), + TextSpan( + text: 'https://www.cialloo.com\n', + style: linkStyle, + recognizer: TapGestureRecognizer() + ..onTap = () { + launchUrl(Uri.parse('https://www.cialloo.com')); + }, + ), + const TextSpan(text: '邮箱 '), + TextSpan( + text: 'admin@cialloo.com', + style: linkStyle, + recognizer: TapGestureRecognizer() + ..onTap = () { + launchUrl(Uri( + scheme: 'mailto', + path: 'admin@cialloo.com', + )); + }, + ), + ], + ), + ), + ); + } +} diff --git a/lib/application_exit_control.dart b/lib/application_exit_control.dart new file mode 100644 index 0000000..2ff49a3 --- /dev/null +++ b/lib/application_exit_control.dart @@ -0,0 +1,67 @@ +import 'dart:ui'; +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:winui_n2n/edge_state.dart'; +import 'package:winui_n2n/home_page.dart'; + +class ApplicationExitControl extends StatefulWidget { + const ApplicationExitControl({super.key}); + + @override + State createState() => _ApplicationExitControlState(); +} + +class _ApplicationExitControlState extends State { + late final AppLifecycleListener _listener; + + @override + void initState() { + super.initState(); + _listener = AppLifecycleListener( + onExitRequested: _handleExitRequest, + ); + } + + @override + void dispose() { + _listener.dispose(); + super.dispose(); + } + + Future _handleExitRequest() async { + if (EdgeState.instance.isRunning && EdgeState.instance.process != null) { + if (EdgeState.instance.process!.kill()) { + EdgeState.instance.isRunning = false; + EdgeState.instance.process = null; + } else { + // TODO: Handle abnormal close. + return AppExitResponse.cancel; + } + } + + // Uninstall tap device before exit + final findTapResult = await Process.run( + "./tools/driver/devcon.exe", + ["hwids", "tap0901"], + ); + if (!findTapResult.stdout + .toString() + .contains('No matching devices found.')) { + // Unstall tap device + await Process.run( + "./tools/driver/devcon.exe", + [ + "remove", + "tap0901", + ], + ); + } + + return AppExitResponse.exit; + } + + @override + Widget build(BuildContext context) { + return const HomePage(); + } +} diff --git a/lib/control_page.dart b/lib/control_page.dart new file mode 100644 index 0000000..06ac5f2 --- /dev/null +++ b/lib/control_page.dart @@ -0,0 +1,442 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:winui_n2n/edge_state.dart'; +import 'package:winui_n2n/saved_connection.dart'; +import 'package:winui_n2n/shared_pref_singleton.dart'; + +class ControlPage extends StatefulWidget { + const ControlPage({super.key}); + + @override + State createState() => _ControlPageState(); +} + +class _ControlPageState extends State { + late TextEditingController _supernodeController; + late TextEditingController _communityController; + late TextEditingController _keyController; + late TextEditingController _selfAddressController; + late TextEditingController _configNameController; + + bool _edgeConnecting = false; + + @override + void initState() { + super.initState(); + _supernodeController = TextEditingController(); + _communityController = TextEditingController(); + _keyController = TextEditingController(); + _selfAddressController = TextEditingController(); + _configNameController = TextEditingController(); + } + + @override + void dispose() { + _supernodeController.dispose(); + _communityController.dispose(); + _keyController.dispose(); + _selfAddressController.dispose(); + _configNameController.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: 300, + child: TextField( + controller: _supernodeController, + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: '主服务器', + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: 300, + child: TextField( + controller: _communityController, + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: '网络社区', + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: 300, + child: TextField( + controller: _keyController, + obscureText: true, + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: '社区密码', + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: 300, + child: TextField( + controller: _selfAddressController, + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: '我的地址', + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton( + onPressed: () => showDialog( + context: context, + builder: (BuildContext context) => Dialog( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 350, + child: TextField( + controller: _configNameController, + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: '给这个配置备注一个名字', + ), + ), + ), + const SizedBox(height: 15), + Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + TextButton( + onPressed: () { + List nodeList = jsonDecode( + SharedPrefSingleton().savedConnection); + List nodes = nodeList + .cast>() + .map((nodeData) => + SavedConnection.fromJson(nodeData)) + .toList(); + nodes.add(SavedConnection( + _configNameController.text, + _supernodeController.text, + _communityController.text, + _keyController.text, + _selfAddressController.text, + )); + + List> nodeMaps = nodes + .map((node) => node.toJson()) + .toList(); + String jsonString = jsonEncode(nodeMaps); + SharedPrefSingleton() + .setSavedConnection(jsonString); + + Navigator.pop(context); + return; + }, + child: const Text("保存")), + TextButton( + onPressed: () { + Navigator.pop(context); + return; + }, + child: const Text('取消'), + ), + ], + ), + ], + ), + ), + ), + ), + child: const Text('保存配置'), + ), + ElevatedButton( + onPressed: _edgeConnecting + ? null + : () async { + if (EdgeState.instance.isRunning) { + // Turn on firewall + if (SharedPrefSingleton().autoFirewall) { + await Process.run( + "netsh.exe", + [ + "advfirewall", + "set", + "allprofiles", + "state", + "on", + ], + ); + } + + // Kill the edge process + if (EdgeState.instance.process != null) { + if (EdgeState.instance.process!.kill()) { + EdgeState.instance.isRunning = false; + EdgeState.instance.process = null; + setState(() {}); + } + } + } else if (!EdgeState.instance.isRunning) { + // Block user click + setState(() { + _edgeConnecting = true; + }); + + // Check for tap device + final findTapResult = await Process.run( + "./tools/driver/devcon.exe", + ["hwids", "tap0901"], + ); + if (findTapResult.stdout + .toString() + .contains('No matching devices found.')) { + // Install tap device + EdgeState.instance.logger + .addLog("Tap device not found, installing tap"); + debugPrint("Tap device not found, installing tap"); + final installTapResult = await Process.run( + "./tools/driver/devcon.exe", + [ + "install", + "./tools/driver/OemVista.inf", + "tap0901", + ], + ); + if (installTapResult.stdout.toString().contains( + "Tap driver installed successfully.") || + installTapResult.stdout.toString().contains( + "Drivers installed successfully.")) { + EdgeState.instance.logger + .addLog("Tap driver installed successfully."); + debugPrint("Tap driver installed successfully."); + } else { + EdgeState.instance.logger + .addLog("Tap driver install failed."); + debugPrint("Tap driver install failed."); + } + } else { + // Ignore. + EdgeState.instance.logger + .addLog("Tap device already installed"); + debugPrint("Tap device already installed"); + } + + // Close firewall + if (SharedPrefSingleton().autoFirewall) { + await Process.run( + "netsh.exe", + [ + "advfirewall", + "set", + "allprofiles", + "state", + "off", + ], + ); + } + + // Start the edge + // edge -c -k -a -r -l + Process.start( + "./tools/edge/edge.exe", + [ + "-l", + _supernodeController.text, + "-c", + _communityController.text, + "-k", + _keyController.text, + "-a", + _selfAddressController.text, + "-r", + ], + ).then((process) async { + EdgeState.instance.isRunning = true; + EdgeState.instance.process = process; + EdgeState.instance.logger + .addLog("edge.exe starting"); + debugPrint("edge.exe starting"); + setState(() { + _edgeConnecting = false; + }); + process.stdout + .transform(const SystemEncoding().decoder) + .listen((data) { + debugPrint('stdout: $data'); + EdgeState.instance.logger.addLog(data); + }); + + await process.exitCode; + EdgeState.instance.isRunning = false; + EdgeState.instance.process = null; + EdgeState.instance.logger + .addLog("edge.exe closing"); + debugPrint("edge.exe closing"); + if (!mounted) return; + setState(() {}); + }); + } + }, + child: EdgeState.instance.isRunning + ? const Text("断开连接") + : const Text("开始连接"), + ), + TextButton( + onPressed: () { + SavedConnection? selectedSavedConnection; + showDialog( + context: context, + builder: (BuildContext context) => Dialog( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Builder(builder: (context) { + String jsonString = + SharedPrefSingleton().savedConnection; + List nodeList = jsonDecode(jsonString); + List nodes = nodeList + .cast>() + .map((nodeData) => + SavedConnection.fromJson(nodeData)) + .toList(); + + return StatefulBuilder(builder: + (BuildContext context, + StateSetter setState) { + return DropdownButton( + value: selectedSavedConnection, + items: nodes.map< + DropdownMenuItem< + SavedConnection>>( + (SavedConnection value) { + return DropdownMenuItem< + SavedConnection>( + value: value, + child: Text(value.name), + ); + }).toList(), + onChanged: (value) { + setState( + () { + selectedSavedConnection = value!; + }, + ); + }); + }); + }), + const SizedBox(height: 15), + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton( + onPressed: () { + if (selectedSavedConnection != null) { + _supernodeController.text = + selectedSavedConnection!.supernode; + _communityController.text = + selectedSavedConnection!.community; + _keyController.text = + selectedSavedConnection! + .communityKey; + _selfAddressController.text = + selectedSavedConnection! + .selfAddress; + } + + Navigator.pop(context); + return; + }, + child: const Text('使用'), + ), + TextButton( + onPressed: () { + if (selectedSavedConnection == null) { + Navigator.pop(context); + return; + } + + String jsonString = + SharedPrefSingleton().savedConnection; + List nodeList = + jsonDecode(jsonString); + List nodes = nodeList + .cast>() + .map((nodeData) => + SavedConnection.fromJson( + nodeData)) + .toList(); + + nodes.removeWhere( + (element) { + return element.name == + selectedSavedConnection!.name; + }, + ); + + List> nodeMaps = + nodes + .map((node) => node.toJson()) + .toList(); + SharedPrefSingleton() + .setSavedConnection( + jsonEncode(nodeMaps)) + .then((onValue) { + Navigator.pop(context); + return; + }); + }, + child: const Text('删除'), + ), + TextButton( + onPressed: () { + Navigator.pop(context); + return; + }, + child: const Text("取消"), + ), + ], + ), + ], + ), + ), + ), + ); + }, + child: const Text("使用配置")), + ], + ), + ), + ], + ); + } +} diff --git a/lib/edge_state.dart b/lib/edge_state.dart new file mode 100644 index 0000000..acce6ae --- /dev/null +++ b/lib/edge_state.dart @@ -0,0 +1,20 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; + +class EdgeState { + EdgeState._internal(); + static final EdgeState instance = EdgeState._internal(); + bool isRunning = false; + Process? process; + EdgeLogger logger = EdgeLogger(); +} + +class EdgeLogger with ChangeNotifier { + List logList = []; + + void addLog(String log) { + logList.add(log); + notifyListeners(); + } +} diff --git a/lib/home_page.dart b/lib/home_page.dart new file mode 100644 index 0000000..429d713 --- /dev/null +++ b/lib/home_page.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:winui_n2n/control_page.dart'; +import 'package:winui_n2n/about_page.dart'; +import 'package:winui_n2n/logger_page.dart'; +import 'package:winui_n2n/main.dart'; +import 'package:winui_n2n/setting_page.dart'; + +class HomePage extends StatefulWidget { + const HomePage({super.key}); + + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State { + int _selectedIndex = 0; + + Widget _homePageShow() { + if (_selectedIndex == 0) { + return const ControlPage(); + } else if (_selectedIndex == 1) { + return const AboutPage(); + } else if (_selectedIndex == 2) { + return const LoggerPage(); + } else if (_selectedIndex == 3) { + return const SettingPage(); + } + + // Must contain a default widget. + return const Text("Default"); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Row( + children: [ + NavigationRail( + selectedIndex: _selectedIndex, + onDestinationSelected: (int index) { + setState(() { + _selectedIndex = index; + }); + }, + labelType: NavigationRailLabelType.all, + trailing: Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: IconButton( + icon: + MainApp.of(context).getCurrentTheme == ThemeMode.light + ? const Icon(Icons.dark_mode) + : const Icon(Icons.light_mode), + onPressed: () { + MainApp.of(context).getCurrentTheme == ThemeMode.light + ? MainApp.of(context).changeTheme(ThemeMode.dark) + : MainApp.of(context).changeTheme(ThemeMode.light); + setState(() {}); + }), + ), + ), + ), + destinations: const [ + NavigationRailDestination( + icon: Icon(Icons.favorite_border), + selectedIcon: Icon(Icons.favorite), + label: Text('主页'), + ), + NavigationRailDestination( + icon: Icon(Icons.bookmark_border), + selectedIcon: Icon(Icons.book), + label: Text('关于'), + ), + NavigationRailDestination( + icon: Icon(Icons.pause_circle_filled), + selectedIcon: Icon(Icons.pause_circle), + label: Text('日志'), + ), + NavigationRailDestination( + icon: Icon(Icons.star_border), + selectedIcon: Icon(Icons.star), + label: Text('设置'), + ), + ], + ), + const VerticalDivider(thickness: 1, width: 1), + // This is the main content. + Expanded( + child: _homePageShow(), + ), + ], + ), + ); + } +} diff --git a/lib/logger_page.dart b/lib/logger_page.dart new file mode 100644 index 0000000..aa9d100 --- /dev/null +++ b/lib/logger_page.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:winui_n2n/edge_state.dart'; + +class LoggerPage extends StatelessWidget { + const LoggerPage({super.key}); + + @override + Widget build(BuildContext context) { + return ListenableBuilder( + listenable: EdgeState.instance.logger, + builder: (context, child) { + return ListView( + children: EdgeState.instance.logger.logList.map( + (e) { + return SelectableText(e); + }, + ).toList(), + ); + }, + ); + } +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..07054c3 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,77 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:window_manager/window_manager.dart'; +import 'package:winui_n2n/application_exit_control.dart'; +import 'package:winui_n2n/edge_state.dart'; +import 'package:winui_n2n/shared_pref_singleton.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await windowManager.ensureInitialized(); + + WindowOptions windowOptions = const WindowOptions( + size: Size(630, 420), + center: true, + backgroundColor: Colors.transparent, + skipTaskbar: false, + titleBarStyle: TitleBarStyle.normal, + windowButtonVisibility: false, + ); + windowManager.waitUntilReadyToShow(windowOptions, () async { + await windowManager.show(); + await windowManager.focus(); + }); + + await initSingleton(); + runApp(const MainApp()); +} + +class MainApp extends StatefulWidget { + const MainApp({super.key}); + + @override + State createState() => _MainAppState(); + + static _MainAppState of(BuildContext context) { + return context.findAncestorStateOfType<_MainAppState>()!; + } +} + +class _MainAppState extends State { + // false = dark, true = light + ThemeMode _themeMode = + SharedPrefSingleton().appTheme ? ThemeMode.light : ThemeMode.dark; + ThemeMode get getCurrentTheme => _themeMode; + + @override + Widget build(BuildContext context) { + return MaterialApp( + theme: ThemeData(), + darkTheme: ThemeData.dark(), + themeMode: _themeMode, + home: const Scaffold( + body: ApplicationExitControl(), + ), + ); + } + + void changeTheme(ThemeMode mode) { + mode == ThemeMode.light + ? SharedPrefSingleton().setAppTheme(true).then((onValue) { + setState(() { + _themeMode = mode; + }); + }) + : SharedPrefSingleton().setAppTheme(false).then((onValue) { + setState(() { + _themeMode = mode; + }); + }); + } +} + +Future initSingleton() async { + EdgeState.instance; + await SharedPrefSingleton().initialize(); +} diff --git a/lib/saved_connection.dart b/lib/saved_connection.dart new file mode 100644 index 0000000..f4d218e --- /dev/null +++ b/lib/saved_connection.dart @@ -0,0 +1,27 @@ +class SavedConnection { + final String name; + final String supernode; + final String community; + final String communityKey; + final String selfAddress; + + SavedConnection(this.name, this.supernode, this.community, this.communityKey, + this.selfAddress); + + factory SavedConnection.fromJson(Map json) => + SavedConnection( + json['name'] as String, + json['supernode'] as String, + json['community'] as String, + json['communityKey'] as String, + json['selfAddress'] as String, + ); + + Map toJson() => { + 'name': name, + 'supernode': supernode, + 'community': community, + 'communityKey': communityKey, + 'selfAddress': selfAddress, + }; +} diff --git a/lib/setting_page.dart b/lib/setting_page.dart new file mode 100644 index 0000000..8a4e705 --- /dev/null +++ b/lib/setting_page.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:winui_n2n/shared_pref_singleton.dart'; + +class SettingPage extends StatefulWidget { + const SettingPage({super.key}); + + @override + State createState() => _SettingPageState(); +} + +class _SettingPageState extends State { + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text('自动设置防火墙'), + Switch( + value: SharedPrefSingleton().autoFirewall, + onChanged: (value) { + final setting = !SharedPrefSingleton().autoFirewall; + SharedPrefSingleton().setAutoFirewall(setting).then((ok) { + setState(() {}); + }); + }, + ), + ], + ), + ElevatedButton( + onPressed: () { + ScaffoldMessenger.of(context) + ..removeCurrentSnackBar() + ..showSnackBar( + const SnackBar( + content: Text("功能暂未开发, 敬请期待~"), + duration: Duration(seconds: 2), + ), + ); + }, + child: const Text("检查更新"), + ), + ], + ); + } +} diff --git a/lib/shared_pref_singleton.dart b/lib/shared_pref_singleton.dart new file mode 100644 index 0000000..558c1f9 --- /dev/null +++ b/lib/shared_pref_singleton.dart @@ -0,0 +1,22 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +class SharedPrefSingleton { + static final SharedPrefSingleton _instance = SharedPrefSingleton._internal(); + factory SharedPrefSingleton() => _instance; + SharedPrefSingleton._internal(); + late SharedPreferences _pref; + Future initialize() async { + _pref = await SharedPreferences.getInstance(); + } + + Future setAutoFirewall(bool ok) => _pref.setBool("auto_firewall", ok); + bool get autoFirewall => _pref.getBool("auto_firewall") ?? true; + + Future setAppTheme(bool ok) => _pref.setBool("app_theme", ok); + // false = dark, true = light + bool get appTheme => _pref.getBool("app_theme") ?? false; + + Future setSavedConnection(String config) => + _pref.setString("saved_connection", config); + String get savedConnection => _pref.getString("saved_connection") ?? "[]"; +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..acb3bdf --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,418 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + url: "https://pub.dev" + source: hosted + version: "0.8.0" + meta: + dependency: transitive + description: + name: meta + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + url: "https://pub.dev" + source: hosted + version: "1.12.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + platform: + dependency: transitive + description: + name: platform + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + screen_retriever: + dependency: transitive + description: + name: screen_retriever + sha256: "6ee02c8a1158e6dae7ca430da79436e3b1c9563c8cf02f524af997c201ac2b90" + url: "https://pub.dev" + source: hosted + version: "0.1.9" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + url: "https://pub.dev" + source: hosted + version: "2.2.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" + url: "https://pub.dev" + source: hosted + version: "2.2.3" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "034650b71e73629ca08a0bd789fd1d83cc63c2d1e405946f7cef7bc37432f93a" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" + url: "https://pub.dev" + source: hosted + version: "6.3.0" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf + url: "https://pub.dev" + source: hosted + version: "6.3.3" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + url: "https://pub.dev" + source: hosted + version: "14.2.1" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + window_manager: + dependency: "direct main" + description: + name: window_manager + sha256: "8699323b30da4cdbe2aa2e7c9de567a6abd8a97d9a5c850a3c86dcd0b34bbfbf" + url: "https://pub.dev" + source: hosted + version: "0.3.9" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" +sdks: + dart: ">=3.4.3 <4.0.0" + flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..2dcf32d --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,22 @@ +name: winui_n2n +description: "A new Flutter project." +publish_to: 'none' +version: 0.1.0 + +environment: + sdk: '>=3.4.3 <4.0.0' + +dependencies: + flutter: + sdk: flutter + shared_preferences: ^2.2.3 + url_launcher: ^6.3.0 + window_manager: ^0.3.9 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^3.0.0 + +flutter: + uses-material-design: true diff --git a/windows/.gitignore b/windows/.gitignore new file mode 100644 index 0000000..ec4098a --- /dev/null +++ b/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt new file mode 100644 index 0000000..099ef1e --- /dev/null +++ b/windows/CMakeLists.txt @@ -0,0 +1,115 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(winui_n2n LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "winui_n2n") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) + +set(PREBUILD_BINARY "tools") +install(CODE " + file(REMOVE_RECURSE \"${CMAKE_INSTALL_PREFIX}/${PREBUILD_BINARY}\") + " COMPONENT Runtime) +install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${PREBUILD_BINARY}" + DESTINATION "${CMAKE_INSTALL_PREFIX}" COMPONENT Runtime) diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..efb62eb --- /dev/null +++ b/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..fe7ec1c --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,20 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + ScreenRetrieverPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ScreenRetrieverPlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); + WindowManagerPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WindowManagerPlugin")); +} diff --git a/windows/flutter/generated_plugin_registrant.h b/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..fb2dea6 --- /dev/null +++ b/windows/flutter/generated_plugins.cmake @@ -0,0 +1,26 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + screen_retriever + url_launcher_windows + window_manager +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..cbec7f0 --- /dev/null +++ b/windows/runner/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +SET_TARGET_PROPERTIES(${BINARY_NAME} PROPERTIES LINK_FLAGS "/MANIFESTUAC:\"level='requireAdministrator' uiAccess='false'\" /SUBSYSTEM:WINDOWS") diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc new file mode 100644 index 0000000..f6d2643 --- /dev/null +++ b/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "winui_n2n" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "winui_n2n" "\0" + VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "winui_n2n.exe" "\0" + VALUE "ProductName", "winui_n2n" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..c819cb0 --- /dev/null +++ b/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h new file mode 100644 index 0000000..28c2383 --- /dev/null +++ b/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp new file mode 100644 index 0000000..05da0d7 --- /dev/null +++ b/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"winui_n2n", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/windows/runner/resource.h b/windows/runner/resource.h new file mode 100644 index 0000000..ddc7f3e --- /dev/null +++ b/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..157e871 --- /dev/null +++ b/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp new file mode 100644 index 0000000..259d85b --- /dev/null +++ b/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h new file mode 100644 index 0000000..3f0e05c --- /dev/null +++ b/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp new file mode 100644 index 0000000..b5ba2a0 --- /dev/null +++ b/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h new file mode 100644 index 0000000..49b847f --- /dev/null +++ b/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/windows/tools/driver/OemVista.inf b/windows/tools/driver/OemVista.inf new file mode 100644 index 0000000..c6901a3 --- /dev/null +++ b/windows/tools/driver/OemVista.inf @@ -0,0 +1,195 @@ +; **************************************************************************** +; * Copyright (C) 2002-2014 OpenVPN Technologies, Inc. * +; * This program is free software; you can redistribute it and/or modify * +; * it under the terms of the GNU General Public License version 2 * +; * as published by the Free Software Foundation. * +; **************************************************************************** + +; SYNTAX CHECKER +; cd \WINDDK\3790\tools\chkinf +; chkinf c:\src\openvpn\tap-win32\i386\oemvista.inf +; OUTPUT -> file:///c:/WINDDK/3790/tools/chkinf/htm/c%23+src+openvpn+tap-win32+i386+__OemWin2k.htm + +; INSTALL/REMOVE DRIVER +; tapinstall install OemVista.inf tapoas +; tapinstall update OemVista.inf tapoas +; tapinstall remove tapoas + +;********************************************************* +; Note to Developers: +; +; If you are bundling the TAP-Windows driver with your app, +; you should try to rename it in such a way that it will +; not collide with other instances of TAP-Windows defined +; by other apps. Multiple versions of the TAP-Windows +; driver, each installed by different apps, can coexist +; on the same machine if you follow these guidelines. +; NOTE: these instructions assume you are editing the +; generated OemWin2k.inf file, not the source +; OemWin2k.inf.in file which is preprocessed by winconfig +; and uses macro definitions from settings.in. +; +; (1) Rename all tapXXXX instances in this file to +; something different (use at least 5 characters +; for this name!) +; (2) Change the "!define TAP" definition in openvpn.nsi +; to match what you changed tapXXXX to. +; (3) Change TARGETNAME in SOURCES to match what you +; changed tapXXXX to. +; (4) Change TAP_COMPONENT_ID in common.h to match what +; you changed tapXXXX to. +; (5) Change SZDEPENDENCIES in service.h to match what +; you changed tapXXXX to. +; (6) Change DeviceDescription and Provider strings. +; (7) Change PRODUCT_TAP_WIN_DEVICE_DESCRIPTION in constants.h to what you +; set DeviceDescription to. +; +;********************************************************* + +[Version] + Signature = "$Windows NT$" + CatalogFile = tap0901.cat + ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318} + Provider = %Provider% + Class = Net + +; This version number should match the version +; number given in ..\version.m4. + DriverVer = 02/27/2024,9.27.0.0 + +[Strings] + DeviceDescription = "TAP-Windows Adapter V9" + Provider = "TAP-Windows Provider V9" + +;---------------------------------------------------------------- +; Manufacturer + Product Section (Done) +;---------------------------------------------------------------- +[Manufacturer] + %Provider% = tap0901, NTamd64 + +[tap0901.NTamd64] + %DeviceDescription% = tap0901.ndi, root\tap0901 ; Root enumerated + %DeviceDescription% = tap0901.ndi, tap0901 ; Legacy + +;--------------------------------------------------------------- +; Driver Section (Done) +;--------------------------------------------------------------- + +;----------------- Characteristics ------------ +; NCF_PHYSICAL = 0x04 +; NCF_VIRTUAL = 0x01 +; NCF_SOFTWARE_ENUMERATED = 0x02 +; NCF_HIDDEN = 0x08 +; NCF_NO_SERVICE = 0x10 +; NCF_HAS_UI = 0x80 +;----------------- Characteristics ------------ + +[tap0901.ndi] + CopyFiles = tap0901.driver, tap0901.files + AddReg = tap0901.reg + AddReg = tap0901.params.reg + DelReg = tap0901.params.delreg + Characteristics = 0x1 + *IfType = 53 ; IF_TYPE_PROP_VIRTUAL + *MediaType = 0x0 ; NdisMedium802_3 + *PhysicalMediaType = 0 ; NdisPhysicalMediumUnspecified + +[tap0901.ndi.Services] + AddService = tap0901, 2, tap0901.service + +[tap0901.reg] + HKR, Ndi, Service, 0, "tap0901" + HKR, Ndi\Interfaces, UpperRange, 0, "ndis5" + HKR, Ndi\Interfaces, LowerRange, 0, "ethernet" + HKR, , Manufacturer, 0, "%Provider%" + HKR, , ProductName, 0, "%DeviceDescription%" + +[tap0901.params.reg] + HKR, Ndi\params\MTU, ParamDesc, 0, "MTU" + HKR, Ndi\params\MTU, Type, 0, "int" + HKR, Ndi\params\MTU, Default, 0, "1500" + HKR, Ndi\params\MTU, Optional, 0, "0" + HKR, Ndi\params\MTU, Min, 0, "100" + HKR, Ndi\params\MTU, Max, 0, "1500" + HKR, Ndi\params\MTU, Step, 0, "1" + HKR, Ndi\params\MediaStatus, ParamDesc, 0, "Media Status" + HKR, Ndi\params\MediaStatus, Type, 0, "enum" + HKR, Ndi\params\MediaStatus, Default, 0, "0" + HKR, Ndi\params\MediaStatus, Optional, 0, "0" + HKR, Ndi\params\MediaStatus\enum, "0", 0, "Application Controlled" + HKR, Ndi\params\MediaStatus\enum, "1", 0, "Always Connected" + HKR, Ndi\params\NetworkAddress, ParamDesc, 0, "MAC Address" + HKR, Ndi\params\NetworkAddress, Type, 0, "edit" + HKR, Ndi\params\NetworkAddress, Optional, 0, "1" + HKR, Ndi\params\AllowNonAdmin, ParamDesc, 0, "Non-Admin Access" + HKR, Ndi\params\AllowNonAdmin, Type, 0, "enum" + HKR, Ndi\params\AllowNonAdmin, Default, 0, "1" + HKR, Ndi\params\AllowNonAdmin, Optional, 0, "0" + HKR, Ndi\params\AllowNonAdmin\enum, "0", 0, "Not Allowed" + HKR, Ndi\params\AllowNonAdmin\enum, "1", 0, "Allowed" + +[tap0901.params.delreg] + HKR, Ndi\params\MAC + +;---------------------------------------------------------------- +; Service Section +;---------------------------------------------------------------- + +;---------- Service Type ------------- +; SERVICE_KERNEL_DRIVER = 0x01 +; SERVICE_WIN32_OWN_PROCESS = 0x10 +;---------- Service Type ------------- + +;---------- Start Mode --------------- +; SERVICE_BOOT_START = 0x0 +; SERVICE_SYSTEM_START = 0x1 +; SERVICE_AUTO_START = 0x2 +; SERVICE_DEMAND_START = 0x3 +; SERVICE_DISABLED = 0x4 +;---------- Start Mode --------------- + +[tap0901.service] + DisplayName = %DeviceDescription% + ServiceType = 1 + StartType = 3 + ErrorControl = 1 + LoadOrderGroup = NDIS + ServiceBinary = %12%\tap0901.sys + +;----------------------------------------------------------------- +; File Installation +;----------------------------------------------------------------- + +;----------------- Copy Flags ------------ +; COPYFLG_NOSKIP = 0x02 +; COPYFLG_NOVERSIONCHECK = 0x04 +;----------------- Copy Flags ------------ + +; SourceDisksNames +; diskid = description[, [tagfile] [, , subdir]] +; 1 = "Intel Driver Disk 1",e100bex.sys,, + +[SourceDisksNames] + 1 = %DeviceDescription%, tap0901.sys + +; SourceDisksFiles +; filename_on_source = diskID[, [subdir][, size]] +; e100bex.sys = 1,, ; on distribution disk 1 + +[SourceDisksFiles] +tap0901.sys = 1 + +[DestinationDirs] + tap0901.files = 11 + tap0901.driver = 12 + +[tap0901.files] +; TapPanel.cpl,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK +; cipsrvr.exe,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK + +[tap0901.driver] + tap0901.sys,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK + +;--------------------------------------------------------------- +; End +;--------------------------------------------------------------- diff --git a/windows/tools/driver/devcon.exe b/windows/tools/driver/devcon.exe new file mode 100644 index 0000000000000000000000000000000000000000..973ccb4fd46487aaf73405dfe828c2806135ddd9 GIT binary patch literal 116216 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 z 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 Pe_;@KV)f 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 uj6_Z%FHxMRNK_{36HSSDVoPFIqAjsM(V6H