Compare commits
268 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6d7ec3d50 | ||
|
|
d2a116fe55 | ||
|
|
eb3cf9d130 | ||
|
|
7e2258be7d | ||
|
|
bb5d446001 | ||
|
|
e9aba4795f | ||
|
|
c16bb9715f | ||
|
|
0f09e8d433 | ||
|
|
f338dff171 | ||
|
|
3c6ed12637 | ||
|
|
e2f3a11a33 | ||
|
|
0571deb290 | ||
|
|
451b357e40 | ||
|
|
84b67a8f53 | ||
|
|
448cf731bb | ||
|
|
9cb480f0f0 | ||
|
|
6825a631f5 | ||
|
|
39f91a030f | ||
|
|
202e4d5be8 | ||
|
|
045e58778a | ||
|
|
e375d60c67 | ||
|
|
fcb5499d3a | ||
|
|
dd5a54a8e0 | ||
|
|
9f24a46b8a | ||
|
|
d7eaab97dd | ||
|
|
a03d1e5ac5 | ||
|
|
d5d4d88481 | ||
|
|
1c823b09c4 | ||
|
|
e5732bcee1 | ||
|
|
c0f283335a | ||
|
|
64cdf64751 | ||
|
|
609bfc35c0 | ||
|
|
121d11db55 | ||
|
|
5c357f012d | ||
|
|
56285f8637 | ||
|
|
b61158d329 | ||
|
|
0233197073 | ||
|
|
d883397d75 | ||
|
|
5bd82c4637 | ||
|
|
e942867635 | ||
|
|
29749ed7cb | ||
|
|
0288f33556 | ||
|
|
ddeac08991 | ||
|
|
30e12d681c | ||
|
|
f9fce9f2a7 | ||
|
|
9c5bb8c6eb | ||
|
|
f2ab409284 | ||
|
|
7c190810fd | ||
|
|
2b2cd21674 | ||
|
|
f025234c85 | ||
|
|
44035637f7 | ||
|
|
008a5c70b9 | ||
|
|
24eaef1604 | ||
|
|
62adcab722 | ||
|
|
e12b630dfb | ||
|
|
81b3ecb056 | ||
|
|
b4d14644ee | ||
|
|
69fd584c32 | ||
|
|
3444ec50a7 | ||
|
|
02d4c65e01 | ||
|
|
efdcfe9985 | ||
|
|
5884b7a87c | ||
|
|
7229446ce7 | ||
|
|
c355d63768 | ||
|
|
eb0030adeb | ||
|
|
fe224d9ecd | ||
|
|
a98d55db58 | ||
|
|
f034163da5 | ||
|
|
d8fe011509 | ||
|
|
e7bb3b3e83 | ||
|
|
3201206d4f | ||
|
|
69c14d2a5d | ||
|
|
778cbe04d9 | ||
|
|
131a8f421d | ||
|
|
6fcd4b7bd4 | ||
|
|
f3b2f6ab76 | ||
|
|
b556e860c4 | ||
|
|
eb01a005dc | ||
|
|
6dcee51940 | ||
|
|
4c7a53b72b | ||
|
|
73c9fba731 | ||
|
|
0726ae9e83 | ||
|
|
9ba4ca10ca | ||
|
|
38caa645e5 | ||
|
|
41507e966a | ||
|
|
3092f04bcf | ||
|
|
ffc0765a2f | ||
|
|
ac803aa426 | ||
|
|
92b63d9fad | ||
|
|
fda3323386 | ||
|
|
b7a4aba5f3 | ||
|
|
7848a028e3 | ||
|
|
d827aafe89 | ||
|
|
db8094cd68 | ||
|
|
59d29dc12f | ||
|
|
7aad934dae | ||
|
|
0b1e33748a | ||
|
|
97be694d2a | ||
|
|
576e574399 | ||
|
|
6d9a195830 | ||
|
|
8107a8bd1e | ||
|
|
47d783291d | ||
|
|
0295f8dee2 | ||
|
|
d915f73c6c | ||
|
|
187bf3085c | ||
|
|
a353a653d1 | ||
|
|
155f1fde49 | ||
|
|
ec1a535acb | ||
|
|
fb5bcdc364 | ||
|
|
e6f42247e7 | ||
|
|
4bc0b30231 | ||
|
|
1cd2645b87 | ||
|
|
7904d0aadc | ||
|
|
06fa6850a1 | ||
|
|
485f5831ac | ||
|
|
587bcd8e21 | ||
|
|
d43b7b1882 | ||
|
|
ca147143ad | ||
|
|
3371967dad | ||
|
|
b09825ab0f | ||
|
|
5edf45468c | ||
|
|
507e8d5222 | ||
|
|
b9283009df | ||
|
|
60ddaf449d | ||
|
|
5bad81e182 | ||
|
|
2e15f22621 | ||
|
|
6a3a822640 | ||
|
|
e5057e1627 | ||
|
|
0a8f720586 | ||
|
|
5dbfb447b1 | ||
|
|
1f21dfbcfd | ||
|
|
53481830a9 | ||
|
|
7eb8e6456e | ||
|
|
5f0352404b | ||
|
|
b036b8c547 | ||
|
|
39ca977b18 | ||
|
|
abc078fb1b | ||
|
|
166490845c | ||
|
|
c2399e3620 | ||
|
|
a2890b6d0d | ||
|
|
a1dee989c7 | ||
|
|
6ff1dac925 | ||
|
|
0b011929bf | ||
|
|
be3d1ff9e1 | ||
|
|
9c73b7285f | ||
|
|
810793aba7 | ||
|
|
ef8d7d2fd7 | ||
|
|
ae341be638 | ||
|
|
dcef8679d2 | ||
|
|
0bb09a53ea | ||
|
|
deb1156916 | ||
|
|
1d87a81f63 | ||
|
|
8ef8b2528b | ||
|
|
f05109232e | ||
|
|
cf1001bffc | ||
|
|
7bf2218c36 | ||
|
|
48c9879bc4 | ||
|
|
2fe5e5ed01 | ||
|
|
38fd09bd9a | ||
|
|
4c5a81782b | ||
|
|
ace3122e07 | ||
|
|
f5c35487d9 | ||
|
|
06df0e1ee4 | ||
|
|
9735bd1b01 | ||
|
|
cd8bad58cd | ||
|
|
53a3cd9422 | ||
|
|
5e2f25af9b | ||
|
|
865d118651 | ||
|
|
6ea6bfeed0 | ||
|
|
48527eb90a | ||
|
|
33d8f98da9 | ||
|
|
658a30d16a | ||
|
|
0189d1cb55 | ||
|
|
8df94fa02b | ||
|
|
f5f89c31eb | ||
|
|
46cb34f2ec | ||
|
|
f6f13540c8 | ||
|
|
21ce7709ab | ||
|
|
d569e37b81 | ||
|
|
c9c6edeb84 | ||
|
|
9525667ebd | ||
|
|
28a3d86348 | ||
|
|
fc8aa58e62 | ||
|
|
cb2bbacae8 | ||
|
|
c3c6261a2d | ||
|
|
8bfec24108 | ||
|
|
9ad2665ad8 | ||
|
|
28894868e3 | ||
|
|
a8fcd994c9 | ||
|
|
c678ab7d01 | ||
|
|
3a93c08813 | ||
|
|
ab1469638f | ||
|
|
9073caf287 | ||
|
|
1bed8234c9 | ||
|
|
621c70253d | ||
|
|
56ef4ddd47 | ||
|
|
bad9ad3dd7 | ||
|
|
36570645ff | ||
|
|
3711bdc41e | ||
|
|
cbdcd9f63e | ||
|
|
a9268bc56e | ||
|
|
f489347fca | ||
|
|
663925f9e8 | ||
|
|
cc2651c377 | ||
|
|
e651b9c7ff | ||
|
|
bcad236fb6 | ||
|
|
0af8d506c1 | ||
|
|
0b65a0f508 | ||
|
|
b03a758747 | ||
|
|
44597f2fbc | ||
|
|
0844113f3a | ||
|
|
79e99b68d6 | ||
|
|
c64b7bb79c | ||
|
|
e72b438ad2 | ||
|
|
3e4a112a3d | ||
|
|
a020b67f67 | ||
|
|
fa958e7a07 | ||
|
|
1a3e81a3f8 | ||
|
|
0eb7a8a771 | ||
|
|
2fa004808f | ||
|
|
cc5fd30256 | ||
|
|
c90bfc310a | ||
|
|
62d1d621aa | ||
|
|
6e8cbb8e8f | ||
|
|
32fa543164 | ||
|
|
04f93ac54e | ||
|
|
3c87d13b21 | ||
|
|
0949eab72e | ||
|
|
aab67b416f | ||
|
|
83a575e43f | ||
|
|
333949ee53 | ||
|
|
1d1238cea3 | ||
|
|
bd7b436631 | ||
|
|
c136df48b9 | ||
|
|
a090a689cf | ||
|
|
5ef2448a0c | ||
|
|
06ab4c88ad | ||
|
|
48efdea11a | ||
|
|
43cc55cb0a | ||
|
|
71f2436562 | ||
|
|
4653c77a81 | ||
|
|
72b05c6b44 | ||
|
|
b5f68e24d6 | ||
|
|
3948c8ca61 | ||
|
|
cf3a868e3a | ||
|
|
43c29abb23 | ||
|
|
7ef445f526 | ||
|
|
f6c2d4ae6b | ||
|
|
8f9fae6ad9 | ||
|
|
b45f264e2a | ||
|
|
986f8f48c7 | ||
|
|
bbc2e86286 | ||
|
|
2dc126bf19 | ||
|
|
86cbcdc089 | ||
|
|
1dd957f461 | ||
|
|
4be4946756 | ||
|
|
65979cbc75 | ||
|
|
6a7118ff6d | ||
|
|
a88b3553ba | ||
|
|
fd5348d26d | ||
|
|
569569f1fc | ||
|
|
489b9b358b | ||
|
|
71cfdfc7c8 | ||
|
|
6ebf4ed428 | ||
|
|
5be0739c5d | ||
|
|
6721e59277 | ||
|
|
77775d85ab | ||
|
|
6de0865c3e |
4
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -8,7 +8,7 @@ assignees: ''
|
|||||||
---
|
---
|
||||||
|
|
||||||
#####################################################
|
#####################################################
|
||||||
**If you have a technical issue, please do not open a bug this way!**
|
**V1 users: If you have a technical issue, please do not open a bug this way!**
|
||||||
Please use the `wails issue` command!
|
Please use the `wails issue` command!
|
||||||
If you do not do this then the issue may be closed automatically.
|
If you do not do this then the issue may be closed automatically.
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ A clear and concise description of what you expected to happen.
|
|||||||
If applicable, add screenshots to help explain your problem.
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
**System Details**
|
**System Details**
|
||||||
Please provide your platform, GO version and variables, etc
|
V2 users: Please add the output of `wails doctor`.
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
Add any other context about the problem here.
|
Add any other context about the problem here.
|
||||||
|
|||||||
197
README.md
@@ -1,59 +1,92 @@
|
|||||||
<p align="center" style="text-align: center">
|
<p align="center" style="text-align: center">
|
||||||
<img src="logo.png" width="55%"><br/>
|
<img src="logo.png" width="55%"><br/>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
Build desktop applications using Go & Web Technologies.<br/><br/>
|
Build desktop applications using Go & Web Technologies.<br/><br/>
|
||||||
<a href="https://github.com/wailsapp/wails/blob/master/LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg"></a>
|
<a href="https://github.com/wailsapp/wails/blob/master/LICENSE">
|
||||||
<a href="https://goreportcard.com/report/github.com/wailsapp/wails"><img src="https://goreportcard.com/badge/github.com/wailsapp/wails"/></a>
|
<img src="https://img.shields.io/badge/License-MIT-blue.svg">
|
||||||
<a href="http://godoc.org/github.com/wailsapp/wails"><img src="https://img.shields.io/badge/godoc-reference-blue.svg"/></a>
|
</a>
|
||||||
<a href="https://www.codefactor.io/repository/github/wailsapp/wails"><img src="https://www.codefactor.io/repository/github/wailsapp/wails/badge" alt="CodeFactor" /></a>
|
<a href="https://goreportcard.com/report/github.com/wailsapp/wails">
|
||||||
<a href="https://github.com/wailsapp/wails/issues"><img src="https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat" alt="CodeFactor" /></a>
|
<img src="https://goreportcard.com/badge/github.com/wailsapp/wails"/>
|
||||||
<a href="https://app.fossa.io/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_shield" alt="FOSSA Status"><img src="https://app.fossa.io/api/projects/git%2Bgithub.com%2Fwailsapp%2Fwails.svg?type=shield"/></a>
|
</a>
|
||||||
<a href="https://houndci.com"><img src="https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg"/></a>
|
<a href="http://godoc.org/github.com/wailsapp/wails">
|
||||||
<a href="https://github.com/avelino/awesome-go" rel="nofollow"><img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome"></a>
|
<img src="https://img.shields.io/badge/godoc-reference-blue.svg"/>
|
||||||
<a href="https://github.com/wailsapp/wails/workflows/release/badge.svg?branch=master" rel="nofollow"><img src="https://github.com/wailsapp/wails/workflows/release/badge.svg?branch=master" alt="Release Pipelines"></a>
|
</a>
|
||||||
|
<a href="https://www.codefactor.io/repository/github/wailsapp/wails">
|
||||||
|
<img src="https://www.codefactor.io/repository/github/wailsapp/wails/badge" alt="CodeFactor" />
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/wailsapp/wails/issues">
|
||||||
|
<img src="https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat" alt="CodeFactor" />
|
||||||
|
</a>
|
||||||
|
<a href="https://app.fossa.io/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_shield" alt="FOSSA Status">
|
||||||
|
<img src="https://app.fossa.io/api/projects/git%2Bgithub.com%2Fwailsapp%2Fwails.svg?type=shield"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://houndci.com">
|
||||||
|
<img src="https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/avelino/awesome-go" rel="nofollow">
|
||||||
|
<img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/wailsapp/wails/workflows/release/badge.svg?branch=master" rel="nofollow">
|
||||||
|
<img src="https://github.com/wailsapp/wails/workflows/release/badge.svg?branch=master" alt="Release Pipelines"/>
|
||||||
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<span id="nav-1"></span>
|
<span id="nav-1"></span>
|
||||||
|
|
||||||
## Internationalization
|
## Internationalization
|
||||||
|
|
||||||
English | [简体中文](README.zh-Hans.md)
|
[English](README.md) | [简体中文](README.zh-Hans.md)
|
||||||
|
|
||||||
|
<span id="nav-2"></span>
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Click me to Open/Close the directory listing</summary>
|
||||||
|
|
||||||
|
- [1. Internationalization](#nav-1)
|
||||||
|
- [2. Table of Contents](#nav-2)
|
||||||
|
- [3. Introduction](#nav-3)
|
||||||
|
- [3.1 Official Website](#nav-3-1)
|
||||||
|
- [4. Features](#nav-4)
|
||||||
|
- [5. Sponsors](#nav-5)
|
||||||
|
- [6. Installation](#nav-6)
|
||||||
|
- [6.1 MacOS](#nav-6-1)
|
||||||
|
- [6.2 Linux](#nav-6-2)
|
||||||
|
- [6.2.1 Debian/Ubuntu](#nav-6-2-1)
|
||||||
|
- [6.2.2 Arch Linux / ArchLabs / Ctlos Linux](#nav-6-2-2)
|
||||||
|
- [6.2.3 Centos](#nav-6-2-3)
|
||||||
|
- [6.2.4 Fedora](#nav-6-2-4)
|
||||||
|
- [6.2.5 VoidLinux & VoidLinux-musl](#nav-6-2-5)
|
||||||
|
- [6.2.6 Gentoo](#nav-6-2-6)
|
||||||
|
- [6.3 Windows](#nav-6-3)
|
||||||
|
- [7. Usage](#nav-7)
|
||||||
|
- [7.1 Next Steps](#nav-7-1)
|
||||||
|
- [8. FAQ](#nav-8)
|
||||||
|
- [9. Contributors](#nav-9)
|
||||||
|
- [10. Special Mentions](#nav-10)
|
||||||
|
- [12. Special Thanks](#nav-11)
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<span id="nav-3"></span>
|
||||||
|
|
||||||
|
## Introductions
|
||||||
|
|
||||||
The traditional method of providing web interfaces to Go programs is via a built-in web server. Wails offers a different
|
The traditional method of providing web interfaces to Go programs is via a built-in web server. Wails offers a different
|
||||||
approach: it provides the ability to wrap both Go code and a web frontend into a single binary. Tools are provided to
|
approach: it provides the ability to wrap both Go code and a web frontend into a single binary. Tools are provided to
|
||||||
make this easy for you by handling project creation, compilation and bundling. All you have to do is get creative!
|
make this easy for you by handling project creation, compilation and bundling. All you have to do is get creative!
|
||||||
|
|
||||||
|
<span id="nav-3-1"></span>
|
||||||
|
|
||||||
|
### Official Website
|
||||||
|
|
||||||
The official docs can be found at [https://wails.app](https://wails.app).
|
The official docs can be found at [https://wails.app](https://wails.app).
|
||||||
|
|
||||||
Click [here](https://wails.io) if you are interested in trying out v2 Beta for Windows.
|
Click [here](https://wails.io) if you are interested in trying out v2 Beta for Windows.
|
||||||
|
|
||||||
<span id="nav-2"></span>
|
<span id="nav-4"></span>
|
||||||
|
|
||||||
## Contents
|
|
||||||
|
|
||||||
- [1. Internationalization](#nav-1)
|
|
||||||
- [2. Contents](#nav-2)
|
|
||||||
- [3. Features](#nav-3)
|
|
||||||
- [4. Sponsors](#nav-4)
|
|
||||||
- [5. Installation](#nav-5)
|
|
||||||
- [5.1 MacOS](#nav-5-1)
|
|
||||||
- [5.2 Linux](#nav-5-2)
|
|
||||||
- [5.2.1 Debian/Ubuntu](#nav-5-2-1)
|
|
||||||
- [5.2.2 Arch Linux / ArchLabs / Ctlos Linux](#nav-5-2-2)
|
|
||||||
- [5.2.3 Centos](#nav-5-2-3)
|
|
||||||
- [5.2.4 Fedora](#nav-5-2-4)
|
|
||||||
- [5.2.5 VoidLinux & VoidLinux-musl](#nav-5-2-5)
|
|
||||||
- [5.2.6 Gentoo](#nav-5-2-6)
|
|
||||||
- [5.3 Windows](#nav-5-3)
|
|
||||||
- [6. Installation](#nav-6)
|
|
||||||
- [7. Next Steps](#nav-7)
|
|
||||||
- [8. FAQ](#nav-8)
|
|
||||||
- [9. Contributors](#nav-9)
|
|
||||||
- [10. Special Mentions](#nav-10)
|
|
||||||
- [11. Special Thanks](#nav-11)
|
|
||||||
|
|
||||||
<span id="nav-3"></span>
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
@@ -67,12 +100,27 @@ Click [here](https://wails.io) if you are interested in trying out v2 Beta for W
|
|||||||
- Powerful cli tool
|
- Powerful cli tool
|
||||||
- Multiplatform
|
- Multiplatform
|
||||||
|
|
||||||
<span id="nav-4"></span>
|
<span id="nav-5"></span>
|
||||||
|
|
||||||
## Sponsors
|
## Sponsors
|
||||||
|
|
||||||
This project is supported by these kind people / companies:
|
This project is supported by these kind people / companies:
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://www.easywebadv.it/" style="width:150px;">
|
||||||
|
<img src="website/static/img/easyweb.png" width="150"/>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
<a href="https://github.com/sponsors/leaanthony" style="width:100px;">
|
||||||
|
<img src="sponsors/silver%20sponsor.png" width="100"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/letheanVPN" style="width:100px;">
|
||||||
|
<img src="https://github.com/letheanVPN.png?size=100" width="100"/>
|
||||||
|
</a>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
<a href="https://github.com/sponsors/leaanthony" style="width:100px;">
|
<a href="https://github.com/sponsors/leaanthony" style="width:100px;">
|
||||||
<img src="sponsors/bronze%20sponsor.png" width="100"/>
|
<img src="sponsors/bronze%20sponsor.png" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
@@ -82,13 +130,16 @@ This project is supported by these kind people / companies:
|
|||||||
<a href="https://github.com/codydbentley" style="width:100px">
|
<a href="https://github.com/codydbentley" style="width:100px">
|
||||||
<img src="https://github.com/codydbentley.png?size=100" width="100"/>
|
<img src="https://github.com/codydbentley.png?size=100" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="https://github.com/CrackDavid" style="width:100px">
|
||||||
|
<img src="https://github.com/CrackDavid.png?size=100" width="100"/>
|
||||||
|
</a>
|
||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
<a href="https://github.com/matryer" style="width:100px">
|
<a href="https://github.com/matryer" style="width:100px">
|
||||||
<img src="https://github.com/matryer.png" width="100"/>
|
<img src="https://github.com/matryer.png" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://www.jetbrains.com?from=Wails" style="width:100px">
|
<a href="https://www.jetbrains.com?from=Wails" style="width:100px">
|
||||||
<img src="/img/jetbrains-grayscale.png" width="100"/>
|
<img src="/assets/images/jetbrains-grayscale.png" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/tc-hib" style="width:55px">
|
<a href="https://github.com/tc-hib" style="width:55px">
|
||||||
<img src="https://github.com/tc-hib.png?size=55" width="55"/>
|
<img src="https://github.com/tc-hib.png?size=55" width="55"/>
|
||||||
@@ -132,17 +183,29 @@ This project is supported by these kind people / companies:
|
|||||||
<a href="https://github.com/ilgityildirim" style="width:50px">
|
<a href="https://github.com/ilgityildirim" style="width:50px">
|
||||||
<img src="https://github.com/ilgityildirim.png?size=50" width="50"/>
|
<img src="https://github.com/ilgityildirim.png?size=50" width="50"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/ondoki" style="width:65px">
|
|
||||||
<img src="https://github.com/ondoki.png?size=65" width="65"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/questrail" style="width:50px">
|
<a href="https://github.com/questrail" style="width:50px">
|
||||||
<img src="https://github.com/questrail.png?size=50" width="50"/>
|
<img src="https://github.com/questrail.png?size=50" width="50"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/DonTomato" style="width:45px">
|
<a href="https://github.com/DonTomato" style="width:45px">
|
||||||
<img src="https://github.com/DonTomato.png?size=45" width="45"/>
|
<img src="https://github.com/DonTomato.png?size=45" width="45"/>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="https://github.com/taigrr" style="width:45px">
|
||||||
|
<img src="https://github.com/taigrr.png?size=45" width="45"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/charlie-dee" style="width:55px">
|
||||||
|
<img src="https://github.com/charlie-dee.png?size=55" width="55"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/EdenNetworkItalia" style="width:65px">
|
||||||
|
<img src="https://github.com/EdenNetworkItalia.png?size=65" width="65"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/michaelolson1996" style="width:55px">
|
||||||
|
<img src="https://github.com/michaelolson1996.png?size=55" width="55"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/GargantuaX" style="width:45px">
|
||||||
|
<img src="https://github.com/GargantuaX.png?size=45" width="45"/>
|
||||||
|
</a>
|
||||||
|
|
||||||
<span id="nav-5"></span>
|
<span id="nav-6"></span>
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -152,7 +215,7 @@ an installation of Go. The basic requirements are:
|
|||||||
- Go 1.16
|
- Go 1.16
|
||||||
- npm
|
- npm
|
||||||
|
|
||||||
<span id="nav-5-1"></span>
|
<span id="nav-6-1"></span>
|
||||||
|
|
||||||
### MacOS
|
### MacOS
|
||||||
|
|
||||||
@@ -160,11 +223,11 @@ Make sure you have the xcode command line tools installed. This can be done by r
|
|||||||
|
|
||||||
`xcode-select --install`
|
`xcode-select --install`
|
||||||
|
|
||||||
<span id="nav-5-2"></span>
|
<span id="nav-6-2"></span>
|
||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
<span id="nav-5-2-1"></span>
|
<span id="nav-6-2-1"></span>
|
||||||
|
|
||||||
#### Debian/Ubuntu
|
#### Debian/Ubuntu
|
||||||
|
|
||||||
@@ -176,7 +239,7 @@ _Ubuntu: 16.04, 18.04, 19.04_
|
|||||||
|
|
||||||
_Also succesfully tested on: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, Kali, Neon_, Pop!\_OS
|
_Also succesfully tested on: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, Kali, Neon_, Pop!\_OS
|
||||||
|
|
||||||
<span id="nav-5-2-2"></span>
|
<span id="nav-6-2-2"></span>
|
||||||
|
|
||||||
#### Arch Linux / ArchLabs / Ctlos Linux
|
#### Arch Linux / ArchLabs / Ctlos Linux
|
||||||
|
|
||||||
@@ -184,7 +247,7 @@ _Also succesfully tested on: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, K
|
|||||||
|
|
||||||
_Also succesfully test on: Manjaro & ArcoLinux_
|
_Also succesfully test on: Manjaro & ArcoLinux_
|
||||||
|
|
||||||
<span id="nav-5-2-3"></span>
|
<span id="nav-6-2-3"></span>
|
||||||
|
|
||||||
#### Centos
|
#### Centos
|
||||||
|
|
||||||
@@ -192,7 +255,7 @@ _Also succesfully test on: Manjaro & ArcoLinux_
|
|||||||
|
|
||||||
_CentOS 6, 7_
|
_CentOS 6, 7_
|
||||||
|
|
||||||
<span id="nav-5-2-4"></span>
|
<span id="nav-6-2-4"></span>
|
||||||
|
|
||||||
#### Fedora
|
#### Fedora
|
||||||
|
|
||||||
@@ -200,19 +263,19 @@ _CentOS 6, 7_
|
|||||||
|
|
||||||
_Fedora 29, 30_
|
_Fedora 29, 30_
|
||||||
|
|
||||||
<span id="nav-5-2-5"></span>
|
<span id="nav-6-2-5"></span>
|
||||||
|
|
||||||
#### VoidLinux & VoidLinux-musl
|
#### VoidLinux & VoidLinux-musl
|
||||||
|
|
||||||
`xbps-install gtk+3-devel webkit2gtk-devel`
|
`xbps-install gtk+3-devel webkit2gtk-devel`
|
||||||
|
|
||||||
<span id="nav-5-2-6"></span>
|
<span id="nav-6-2-6"></span>
|
||||||
|
|
||||||
#### Gentoo
|
#### Gentoo
|
||||||
|
|
||||||
`sudo emerge gtk+:3 webkit-gtk`
|
`sudo emerge gtk+:3 webkit-gtk`
|
||||||
|
|
||||||
<span id="nav-5-3"></span>
|
<span id="nav-6-3"></span>
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
@@ -220,21 +283,21 @@ Windows requires gcc and related tooling. The recommended download is
|
|||||||
from [http://tdm-gcc.tdragon.net/download](http://tdm-gcc.tdragon.net/download). Once this is installed, you are good to
|
from [http://tdm-gcc.tdragon.net/download](http://tdm-gcc.tdragon.net/download). Once this is installed, you are good to
|
||||||
go.
|
go.
|
||||||
|
|
||||||
<span id="nav-6"></span>
|
<span id="nav-7"></span>
|
||||||
|
|
||||||
## Installation
|
## Usage
|
||||||
|
|
||||||
**Ensure Go modules are enabled: GO111MODULE=on and go/bin is in your PATH variable.**
|
**Ensure Go modules are enabled: GO111MODULE=on and go/bin is in your PATH variable.**
|
||||||
|
|
||||||
Installation is as simple as running the following command:
|
Installation is as simple as running the following command:
|
||||||
|
|
||||||
<pre style='color:white'>
|
```
|
||||||
go get -u github.com/wailsapp/wails/cmd/wails
|
go get -u github.com/wailsapp/wails/cmd/wails
|
||||||
</pre>
|
```
|
||||||
|
|
||||||
<span id="nav-7"></span>
|
<span id="nav-7-1"></span>
|
||||||
|
|
||||||
## Next Steps
|
### Next Steps
|
||||||
|
|
||||||
It is recommended at this stage to read the comprehensive documentation at [https://wails.app](https://wails.app).
|
It is recommended at this stage to read the comprehensive documentation at [https://wails.app](https://wails.app).
|
||||||
|
|
||||||
@@ -304,11 +367,11 @@ It is recommended at this stage to read the comprehensive documentation at [http
|
|||||||
<a href="https://github.com/SophieAu"><img src="https://github.com/SophieAu.png?size=40" width="40"/></a>
|
<a href="https://github.com/SophieAu"><img src="https://github.com/SophieAu.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/alexmat"><img src="https://github.com/alexmat.png?size=40" width="40"/></a>
|
<a href="https://github.com/alexmat"><img src="https://github.com/alexmat.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/RH12503"><img src="https://github.com/RH12503.png?size=40" width="40"/></a>
|
<a href="https://github.com/RH12503"><img src="https://github.com/RH12503.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/hi019"><img src="https://github.com/hi019.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/hi019"><img src="https://github.com/hi019.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/Igogrek"><img src="https://github.com/Igogrek.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/Igogrek"><img src="https://github.com/Igogrek.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/aschey"><img src="https://github.com/aschey.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/aschey"><img src="https://github.com/aschey.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/akhudek"><img src="https://github.com/akhudek.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/akhudek"><img src="https://github.com/akhudek.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/s12chung"><img src="https://github.com/s12chung.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/s12chung"><img src="https://github.com/s12chung.png?size=40" width="40"/></a>
|
||||||
|
|
||||||
<span id="nav-10"></span>
|
<span id="nav-10"></span>
|
||||||
|
|
||||||
@@ -344,13 +407,13 @@ This project was mainly coded to the following albums:
|
|||||||
## Special Thanks
|
## Special Thanks
|
||||||
|
|
||||||
<p align="center" style="text-align: center">
|
<p align="center" style="text-align: center">
|
||||||
<a href="https://pace.dev"><img src="pace.jpeg"/></a><br/>
|
<a href="https://pace.dev"><img src="/assets/images/pace.jpeg"/></a><br/>
|
||||||
A <i>huge<i/> thanks to <a href="https://pace.dev">Pace</a> for sponsoring the project and helping the efforts to get Wails ported to Apple Silicon!<br/><br/>
|
A <i>huge</i> thanks to <a href="https://pace.dev">Pace</a> for sponsoring the project and helping the efforts to get Wails ported to Apple Silicon!<br/><br/>
|
||||||
If you are looking for a Project Management tool that's powerful but quick and easy to use, check them out!<br/><br/>
|
If you are looking for a Project Management tool that's powerful but quick and easy to use, check them out!<br/><br/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center" style="text-align: center">
|
<p align="center" style="text-align: center">
|
||||||
A special thank you to JetBrains for donating licenses to us!<br/><br/>
|
A special thank you to JetBrains for donating licenses to us!<br/><br/>
|
||||||
Please click the logo to let them know your appreciation!<br/><br/>
|
Please click the logo to let them know your appreciation!<br/><br/>
|
||||||
<a href="https://www.jetbrains.com?from=Wails"><img src="jetbrains-grayscale.png" width="30%"></a>
|
<a href="https://www.jetbrains.com?from=Wails"><img src="/assets/images/jetbrains-grayscale.png" width="30%"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -1,61 +1,97 @@
|
|||||||
<p align="center" style="text-align: center">
|
<p align="center" style="text-align: center">
|
||||||
<img src="logo.png" width="40%"><br/>
|
<img src="logo.png" width="55%"><br/>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
使用 Go 和 Web 技术构建桌面应用程序。<br/><br/>
|
使用 Go 和 Web 技术构建桌面应用程序。<br/><br/>
|
||||||
<a href="https://github.com/wailsapp/wails/blob/master/LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg"></a>
|
<a href="https://github.com/wailsapp/wails/blob/master/LICENSE">
|
||||||
<a href="https://goreportcard.com/report/github.com/wailsapp/wails"><img src="https://goreportcard.com/badge/github.com/wailsapp/wails"/></a>
|
<img src="https://img.shields.io/badge/License-MIT-blue.svg">
|
||||||
<a href="http://godoc.org/github.com/wailsapp/wails"><img src="https://img.shields.io/badge/godoc-reference-blue.svg"/></a>
|
</a>
|
||||||
<a href="https://www.codefactor.io/repository/github/wailsapp/wails"><img src="https://www.codefactor.io/repository/github/wailsapp/wails/badge" alt="CodeFactor" /></a>
|
<a href="https://goreportcard.com/report/github.com/wailsapp/wails">
|
||||||
<a href="https://github.com/wailsapp/wails/issues"><img src="https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat" alt="CodeFactor" /></a>
|
<img src="https://goreportcard.com/badge/github.com/wailsapp/wails"/>
|
||||||
<a href="https://app.fossa.io/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_shield" alt="FOSSA Status"><img src="https://app.fossa.io/api/projects/git%2Bgithub.com%2Fwailsapp%2Fwails.svg?type=shield"/></a>
|
</a>
|
||||||
<a href="https://houndci.com"><img src="https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg"/></a>
|
<a href="http://godoc.org/github.com/wailsapp/wails">
|
||||||
<a href="https://github.com/avelino/awesome-go" rel="nofollow"><img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome"></a>
|
<img src="https://img.shields.io/badge/godoc-reference-blue.svg"/>
|
||||||
<a href="https://github.com/wailsapp/wails/workflows/release/badge.svg?branch=master" rel="nofollow"><img src="https://github.com/wailsapp/wails/workflows/release/badge.svg?branch=master" alt="Release Pipelines"></a>
|
</a>
|
||||||
|
<a href="https://www.codefactor.io/repository/github/wailsapp/wails">
|
||||||
|
<img src="https://www.codefactor.io/repository/github/wailsapp/wails/badge" alt="CodeFactor" />
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/wailsapp/wails/issues">
|
||||||
|
<img src="https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat" alt="CodeFactor" />
|
||||||
|
</a>
|
||||||
|
<a href="https://app.fossa.io/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_shield" alt="FOSSA Status">
|
||||||
|
<img src="https://app.fossa.io/api/projects/git%2Bgithub.com%2Fwailsapp%2Fwails.svg?type=shield"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://houndci.com">
|
||||||
|
<img src="https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/avelino/awesome-go" rel="nofollow">
|
||||||
|
<img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/wailsapp/wails/workflows/release/badge.svg?branch=master" rel="nofollow">
|
||||||
|
<img src="https://github.com/wailsapp/wails/workflows/release/badge.svg?branch=master" alt="Release Pipelines"/>
|
||||||
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<span id="nav-1"></span>
|
<span id="nav-1"></span>
|
||||||
|
|
||||||
## 国际化
|
## 国际化
|
||||||
|
|
||||||
[English](README.md) | 简体中文
|
[English](README.md) | [简体中文](README.zh-Hans.md)
|
||||||
|
|
||||||
向 Go 程序提供 Web 接口的传统方法是通过内置 Web 服务器。Wails 提供了一种不同的方法:它提供了将 Go 代码和 Web
|
|
||||||
前端都包装成单个二进制文件的能力。通过提供工具,可以很轻松的完成项目的创建、编译和打包。你所要做的就是发挥创意!
|
|
||||||
|
|
||||||
官方文档可以在 [https://wails.app](https://wails.app) 中找到。
|
|
||||||
|
|
||||||
国内镜像站点 [https://wails.top](https://wails.top)。
|
|
||||||
|
|
||||||
<span id="nav-2"></span>
|
<span id="nav-2"></span>
|
||||||
|
|
||||||
## 内容目录
|
## 内容目录
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>点我 打开/关闭 目录列表</summary>
|
||||||
|
|
||||||
- [1. 国际化](#nav-1)
|
- [1. 国际化](#nav-1)
|
||||||
- [2. 内容目录](#nav-2)
|
- [2. 内容目录](#nav-2)
|
||||||
- [3. 特征](#nav-3)
|
- [3. 项目介绍](#nav-3)
|
||||||
- [4. 赞助商](#nav-4)
|
- [3.1 官方网站](#nav-3-1)
|
||||||
- [5. 安装](#nav-5)
|
- [4. 功能](#nav-4)
|
||||||
- [5.1 MacOS](#nav-5-1)
|
- [5. 赞助商](#nav-5)
|
||||||
- [5.2 Linux](#nav-5-2)
|
|
||||||
- [5.2.1 Debian/Ubuntu](#nav-5-2-1)
|
|
||||||
- [5.2.2 Arch Linux / ArchLabs / Ctlos Linux](#nav-5-2-2)
|
|
||||||
- [5.2.3 Centos](#nav-5-2-3)
|
|
||||||
- [5.2.4 Fedora](#nav-5-2-4)
|
|
||||||
- [5.2.5 VoidLinux & VoidLinux-musl](#nav-5-2-5)
|
|
||||||
- [5.2.6 Gentoo](#nav-5-2-6)
|
|
||||||
- [5.3 Windows](#nav-5-3)
|
|
||||||
- [6. 安装](#nav-6)
|
- [6. 安装](#nav-6)
|
||||||
- [7. 下一步](#nav-7)
|
- [6.1 MacOS](#nav-6-1)
|
||||||
|
- [6.2 Linux](#nav-6-2)
|
||||||
|
- [6.2.1 Debian/Ubuntu](#nav-6-2-1)
|
||||||
|
- [6.2.2 Arch Linux / ArchLabs / Ctlos Linux](#nav-6-2-2)
|
||||||
|
- [6.2.3 Centos](#nav-6-2-3)
|
||||||
|
- [6.2.4 Fedora](#nav-6-2-4)
|
||||||
|
- [6.2.5 VoidLinux & VoidLinux-musl](#nav-6-2-5)
|
||||||
|
- [6.2.6 Gentoo](#nav-6-2-6)
|
||||||
|
- [6.3 Windows](#nav-6-3)
|
||||||
|
- [7. 使用方法](#nav-7)
|
||||||
|
- [7.1 下一步](#nav-7-1)
|
||||||
- [8. 常见问题](#nav-8)
|
- [8. 常见问题](#nav-8)
|
||||||
- [9. 贡献者](#nav-9)
|
- [9. 贡献者](#nav-9)
|
||||||
- [10. 特别提及](#nav-10)
|
- [10. 特别提及](#nav-10)
|
||||||
- [11. 许可协议](#nav-11)
|
- [12. 特别感谢](#nav-11)
|
||||||
- [12. 特别感谢](#nav-12)
|
|
||||||
|
</details>
|
||||||
|
|
||||||
<span id="nav-3"></span>
|
<span id="nav-3"></span>
|
||||||
|
|
||||||
## 特征
|
## 项目介绍
|
||||||
|
|
||||||
|
为 Go 程序提供 Web 界面的传统方法是通过内置 Web 服务器。Wails 提供了一种不同的方法:它提供了将 Go 代码和 Web
|
||||||
|
前端一起打包成单个二进制文件的能力。通过提供的工具,可以很轻松的完成项目的创建、编译和打包。你所要做的就是发挥想象力!
|
||||||
|
|
||||||
|
<span id="nav-3-1"></span>
|
||||||
|
|
||||||
|
### 官方网站
|
||||||
|
|
||||||
|
官方文档可以在 [https://wails.app](https://wails.app) 中找到。
|
||||||
|
|
||||||
|
如果您对适用于 Windows 的 v2 测试版感兴趣,可以点击[此处](https://wails.io)查看。
|
||||||
|
|
||||||
|
镜像网站:
|
||||||
|
|
||||||
|
- [中国大陆镜像站点 - https://wails.top](https://wails.top)
|
||||||
|
|
||||||
|
<span id="nav-4"></span>
|
||||||
|
|
||||||
|
## 功能
|
||||||
|
|
||||||
- 后端使用标准 Go
|
- 后端使用标准 Go
|
||||||
- 使用任意前端技术构建 UI 界面
|
- 使用任意前端技术构建 UI 界面
|
||||||
@@ -67,13 +103,27 @@
|
|||||||
- 强大的命令行工具
|
- 强大的命令行工具
|
||||||
- 跨多个平台
|
- 跨多个平台
|
||||||
|
|
||||||
<span id="nav-4"></span>
|
<span id="nav-5"></span>
|
||||||
|
|
||||||
## 赞助商
|
## 赞助商
|
||||||
|
|
||||||
这个项目由以下这些人或者公司支持:
|
这个项目由以下这些人或者公司支持:
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://www.easywebadv.it/" style="width:100px;">
|
||||||
|
<img src="website/static/img/easyweb.png" width="120"/>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
<a href="https://github.com/sponsors/leaanthony" style="width:100px;">
|
||||||
|
<img src="sponsors/silver%20sponsor.png" width="100"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/letheanVPN" style="width:100px;">
|
||||||
|
<img src="https://github.com/letheanVPN.png?size=100" width="100"/>
|
||||||
|
</a>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
<a href="https://github.com/sponsors/leaanthony" style="width:100px;">
|
<a href="https://github.com/sponsors/leaanthony" style="width:100px;">
|
||||||
<img src="sponsors/bronze%20sponsor.png" width="100"/>
|
<img src="sponsors/bronze%20sponsor.png" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
@@ -83,13 +133,16 @@
|
|||||||
<a href="https://github.com/codydbentley" style="width:100px">
|
<a href="https://github.com/codydbentley" style="width:100px">
|
||||||
<img src="https://github.com/codydbentley.png?size=100" width="100"/>
|
<img src="https://github.com/codydbentley.png?size=100" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="https://github.com/CrackDavid" style="width:100px">
|
||||||
|
<img src="https://github.com/CrackDavid.png?size=100" width="100"/>
|
||||||
|
</a>
|
||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
<a href="https://github.com/matryer" style="width:100px">
|
<a href="https://github.com/matryer" style="width:100px">
|
||||||
<img src="https://github.com/matryer.png" width="100"/>
|
<img src="https://github.com/matryer.png" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://www.jetbrains.com?from=Wails" style="width:100px">
|
<a href="https://www.jetbrains.com?from=Wails" style="width:100px">
|
||||||
<img src="/img/jetbrains-grayscale.png" width="100"/>
|
<img src="/assets/images/jetbrains-grayscale.png" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/tc-hib" style="width:55px">
|
<a href="https://github.com/tc-hib" style="width:55px">
|
||||||
<img src="https://github.com/tc-hib.png?size=55" width="55"/>
|
<img src="https://github.com/tc-hib.png?size=55" width="55"/>
|
||||||
@@ -133,17 +186,29 @@
|
|||||||
<a href="https://github.com/ilgityildirim" style="width:50px">
|
<a href="https://github.com/ilgityildirim" style="width:50px">
|
||||||
<img src="https://github.com/ilgityildirim.png?size=50" width="50"/>
|
<img src="https://github.com/ilgityildirim.png?size=50" width="50"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/ondoki" style="width:65px">
|
|
||||||
<img src="https://github.com/ondoki.png?size=65" width="65"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/questrail" style="width:50px">
|
<a href="https://github.com/questrail" style="width:50px">
|
||||||
<img src="https://github.com/questrail.png?size=50" width="50"/>
|
<img src="https://github.com/questrail.png?size=50" width="50"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/DonTomato" style="width:45px">
|
<a href="https://github.com/DonTomato" style="width:45px">
|
||||||
<img src="https://github.com/DonTomato.png?size=45" width="45"/>
|
<img src="https://github.com/DonTomato.png?size=45" width="45"/>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="https://github.com/taigrr" style="width:45px">
|
||||||
|
<img src="https://github.com/taigrr.png?size=45" width="45"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/charlie-dee" style="width:55px">
|
||||||
|
<img src="https://github.com/charlie-dee.png?size=55" width="55"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/EdenNetworkItalia" style="width:65px">
|
||||||
|
<img src="https://github.com/EdenNetworkItalia.png?size=65" width="65"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/michaelolson1996" style="width:55px">
|
||||||
|
<img src="https://github.com/michaelolson1996.png?size=55" width="55"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/GargantuaX" style="width:45px">
|
||||||
|
<img src="https://github.com/GargantuaX.png?size=45" width="45"/>
|
||||||
|
</a>
|
||||||
|
|
||||||
<span id="nav-5"></span>
|
<span id="nav-6"></span>
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
||||||
@@ -152,7 +217,7 @@ Wails 使用 cgo 与原生渲染引擎结合,因此需要依赖一些平台的
|
|||||||
- Go 1.16
|
- Go 1.16
|
||||||
- npm
|
- npm
|
||||||
|
|
||||||
<span id="nav-5-1"></span>
|
<span id="nav-6-1"></span>
|
||||||
|
|
||||||
### MacOS
|
### MacOS
|
||||||
|
|
||||||
@@ -160,11 +225,11 @@ Wails 使用 cgo 与原生渲染引擎结合,因此需要依赖一些平台的
|
|||||||
|
|
||||||
`xcode-select --install`
|
`xcode-select --install`
|
||||||
|
|
||||||
<span id="nav-5-2"></span>
|
<span id="nav-6-2"></span>
|
||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
<span id="nav-5-2-1"></span>
|
<span id="nav-6-2-1"></span>
|
||||||
|
|
||||||
#### Debian/Ubuntu
|
#### Debian/Ubuntu
|
||||||
|
|
||||||
@@ -176,7 +241,7 @@ _Ubuntu: 16.04, 18.04, 19.04_
|
|||||||
|
|
||||||
_也成功测试了: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, Kali, Neon_, Pop!\_OS
|
_也成功测试了: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, Kali, Neon_, Pop!\_OS
|
||||||
|
|
||||||
<span id="nav-5-2-2"></span>
|
<span id="nav-6-2-2"></span>
|
||||||
|
|
||||||
#### Arch Linux / ArchLabs / Ctlos Linux
|
#### Arch Linux / ArchLabs / Ctlos Linux
|
||||||
|
|
||||||
@@ -184,7 +249,7 @@ _也成功测试了: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, Kali, Neo
|
|||||||
|
|
||||||
_也成功测试了: Manjaro & ArcoLinux_
|
_也成功测试了: Manjaro & ArcoLinux_
|
||||||
|
|
||||||
<span id="nav-5-2-3"></span>
|
<span id="nav-6-2-3"></span>
|
||||||
|
|
||||||
#### Centos
|
#### Centos
|
||||||
|
|
||||||
@@ -192,7 +257,7 @@ _也成功测试了: Manjaro & ArcoLinux_
|
|||||||
|
|
||||||
_CentOS 6, 7_
|
_CentOS 6, 7_
|
||||||
|
|
||||||
<span id="nav-5-2-4"></span>
|
<span id="nav-6-2-4"></span>
|
||||||
|
|
||||||
#### Fedora
|
#### Fedora
|
||||||
|
|
||||||
@@ -200,39 +265,39 @@ _CentOS 6, 7_
|
|||||||
|
|
||||||
_Fedora 29, 30_
|
_Fedora 29, 30_
|
||||||
|
|
||||||
<span id="nav-5-2-5"></span>
|
<span id="nav-6-2-5"></span>
|
||||||
|
|
||||||
#### VoidLinux & VoidLinux-musl
|
#### VoidLinux & VoidLinux-musl
|
||||||
|
|
||||||
`xbps-install gtk+3-devel webkit2gtk-devel`
|
`xbps-install gtk+3-devel webkit2gtk-devel`
|
||||||
|
|
||||||
<span id="nav-5-2-6"></span>
|
<span id="nav-6-2-6"></span>
|
||||||
|
|
||||||
#### Gentoo
|
#### Gentoo
|
||||||
|
|
||||||
`sudo emerge gtk+:3 webkit-gtk`
|
`sudo emerge gtk+:3 webkit-gtk`
|
||||||
|
|
||||||
<span id="nav-5-3"></span>
|
<span id="nav-6-3"></span>
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
Windows 需要 GCC 和相关工具。 建议从 [http://tdm-gcc.tdragon.net/download](http://tdm-gcc.tdragon.net/download) 下载, 安装完成,您就可以开始了。
|
Windows 需要 GCC 和相关工具。 建议从 [http://tdm-gcc.tdragon.net/download](http://tdm-gcc.tdragon.net/download) 下载, 安装完成,您就可以开始了。
|
||||||
|
|
||||||
<span id="nav-6"></span>
|
<span id="nav-7"></span>
|
||||||
|
|
||||||
## 安装
|
## 使用方法
|
||||||
|
|
||||||
**确保 Go modules 是开启的:GO111MODULE=on 并且 go/bin 在您的 PATH 变量中。**
|
**确保 Go modules 是开启的:GO111MODULE=on 并且 go/bin 在您的 PATH 变量中。**
|
||||||
|
|
||||||
安装很简单,运行以下命令:
|
安装很简单,运行以下命令:
|
||||||
|
|
||||||
<pre style='color:white'>
|
```
|
||||||
go get -u github.com/wailsapp/wails/cmd/wails
|
go get -u github.com/wailsapp/wails/cmd/wails
|
||||||
</pre>
|
```
|
||||||
|
|
||||||
<span id="nav-7"></span>
|
<span id="nav-7-1"></span>
|
||||||
|
|
||||||
## 下一步
|
### 下一步
|
||||||
|
|
||||||
建议在此时阅读 [https://wails.app](https://wails.app) 上面的文档.
|
建议在此时阅读 [https://wails.app](https://wails.app) 上面的文档.
|
||||||
|
|
||||||
@@ -244,14 +309,14 @@ go get -u github.com/wailsapp/wails/cmd/wails
|
|||||||
|
|
||||||
取决于您的要求。它旨在使 Go 程序员可以轻松制作轻量级桌面应用程序或在其现有应用程序中添加前端。尽管 Wails 当前不提供对诸如菜单之类的原生元素的钩子,但将来可能会改变。
|
取决于您的要求。它旨在使 Go 程序员可以轻松制作轻量级桌面应用程序或在其现有应用程序中添加前端。尽管 Wails 当前不提供对诸如菜单之类的原生元素的钩子,但将来可能会改变。
|
||||||
|
|
||||||
- 这个项目针对的是谁?
|
- 这个项目针对的是哪些人?
|
||||||
|
|
||||||
希望将 HTML / JS / CSS 前端与其应用程序捆绑在一起的程序员,而不是借助创建服务并打开浏览器进行查看的方式。
|
希望将 HTML / JS / CSS 前端与其应用程序捆绑在一起的程序员,而不是借助创建服务并打开浏览器进行查看的方式。
|
||||||
|
|
||||||
- 名字怎么来的?
|
- 名字怎么来的?
|
||||||
|
|
||||||
当我看到 WebView 时,我想"我真正想要的是围绕构建 WebView 应用程序工作,有点像 Rails 对于 Ruby"。因此,最初它是一个文字游戏(Webview on
|
当我看到 WebView 时,我想"我真正想要的是围绕构建 WebView 应用程序工作,有点像 Rails 对于 Ruby"。因此,最初它是一个文字游戏(Webview on
|
||||||
Rails)。碰巧也是我来自的 [国家](https://en.wikipedia.org/wiki/Wales) 的英文名字的同音。所以就是他了。
|
Rails)。碰巧也是我来自的 [国家](https://en.wikipedia.org/wiki/Wales) 的英文名字的同音。所以就是它了。
|
||||||
|
|
||||||
<span id="nav-9"></span>
|
<span id="nav-9"></span>
|
||||||
|
|
||||||
@@ -298,10 +363,11 @@ go get -u github.com/wailsapp/wails/cmd/wails
|
|||||||
<a href="https://github.com/SophieAu"><img src="https://github.com/SophieAu.png?size=40" width="40"/></a>
|
<a href="https://github.com/SophieAu"><img src="https://github.com/SophieAu.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/alexmat"><img src="https://github.com/alexmat.png?size=40" width="40"/></a>
|
<a href="https://github.com/alexmat"><img src="https://github.com/alexmat.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/RH12503"><img src="https://github.com/RH12503.png?size=40" width="40"/></a>
|
<a href="https://github.com/RH12503"><img src="https://github.com/RH12503.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/hi019"><img src="https://github.com/hi019.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/hi019"><img src="https://github.com/hi019.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/Igogrek"><img src="https://github.com/Igogrek.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/Igogrek"><img src="https://github.com/Igogrek.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/aschey"><img src="https://github.com/aschey.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/aschey"><img src="https://github.com/aschey.png?size=40" width="40"/></a>
|
||||||
<a href="https://github.com/akhudek"><img src="https://github.com/akhudek.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/akhudek"><img src="https://github.com/akhudek.png?size=40" width="40"/></a>
|
||||||
|
<a href="https://github.com/s12chung"><img src="https://github.com/s12chung.png?size=40" width="40"/></a>
|
||||||
|
|
||||||
<span id="nav-10"></span>
|
<span id="nav-10"></span>
|
||||||
|
|
||||||
@@ -311,9 +377,9 @@ go get -u github.com/wailsapp/wails/cmd/wails
|
|||||||
|
|
||||||
- [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - 他的支持和反馈是巨大的。
|
- [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - 他的支持和反馈是巨大的。
|
||||||
- [Serge Zaitsev](https://github.com/zserge) - Wails 窗口所使用的 [Webview](https://github.com/zserge/webview) 的作者。
|
- [Serge Zaitsev](https://github.com/zserge) - Wails 窗口所使用的 [Webview](https://github.com/zserge/webview) 的作者。
|
||||||
- [Byron](https://github.com/bh90210) - 有时,Byron 单枪匹马地保持这个项目活着。没有他令人难以置信的投入,我们永远不会得到 v1 。
|
- [Byron](https://github.com/bh90210) - 有时,Byron 一个人保持这个项目活跃着。没有他令人难以置信的投入,我们永远不会得到 v1 。
|
||||||
|
|
||||||
This project was mainly coded to the following albums:
|
编写项目代码时伴随着以下专辑:
|
||||||
|
|
||||||
- [Manic Street Preachers - Resistance Is Futile](https://open.spotify.com/album/1R2rsEUqXjIvAbzM0yHrxA)
|
- [Manic Street Preachers - Resistance Is Futile](https://open.spotify.com/album/1R2rsEUqXjIvAbzM0yHrxA)
|
||||||
- [Manic Street Preachers - This Is My Truth, Tell Me Yours](https://open.spotify.com/album/4VzCL9kjhgGQeKCiojK1YN)
|
- [Manic Street Preachers - This Is My Truth, Tell Me Yours](https://open.spotify.com/album/4VzCL9kjhgGQeKCiojK1YN)
|
||||||
@@ -331,22 +397,16 @@ This project was mainly coded to the following albums:
|
|||||||
|
|
||||||
<span id="nav-11"></span>
|
<span id="nav-11"></span>
|
||||||
|
|
||||||
## 许可协议
|
|
||||||
|
|
||||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_large)
|
|
||||||
|
|
||||||
<span id="nav-12"></span>
|
|
||||||
|
|
||||||
## 特别感谢
|
## 特别感谢
|
||||||
|
|
||||||
<p align="center" style="text-align: center">
|
<p align="center" style="text-align: center">
|
||||||
<a href="https://pace.dev"><img src="pace.jpeg"/></a><br/>
|
<a href="https://pace.dev"><img src="/assets/images/pace.jpeg"/></a><br/>
|
||||||
<i>非常<i/>感谢<a href="https://pace.dev">Pace</a>对项目的赞助,并帮助将 Wails 移植到 Apple Silicon !<br/><br/>
|
<i>非常</i> 感谢<a href="https://pace.dev">Pace</a>对项目的赞助,并帮助将 Wails 移植到 Apple Silicon !<br/><br/>
|
||||||
如果您正在寻找一个强大并且快速和易于使用的项目管理工具,可以看看他们!<br/><br/>
|
如果您正在寻找一个强大并且快速和易于使用的项目管理工具,可以看看他们!<br/><br/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center" style="text-align: center">
|
<p align="center" style="text-align: center">
|
||||||
特别感谢 JetBrains 向我们捐赠许可!<br/><br/>
|
特别感谢 JetBrains 向我们捐赠许可!<br/><br/>
|
||||||
请点击 logo 让他们知道你的感激之情!<br/><br/>
|
请点击 logo 让他们知道你的感激之情!<br/><br/>
|
||||||
<a href="https://www.jetbrains.com?from=Wails"><img src="jetbrains-grayscale.png" width="30%"></a>
|
<a href="https://www.jetbrains.com?from=Wails"><img src="/assets/images/jetbrains-grayscale.png" width="30%"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
21
cmd/fs.go
@@ -6,7 +6,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
@@ -50,7 +49,7 @@ func (fs *FSHelper) FileExists(path string) bool {
|
|||||||
|
|
||||||
// FindFile returns the first occurrence of match inside path.
|
// FindFile returns the first occurrence of match inside path.
|
||||||
func (fs *FSHelper) FindFile(path, match string) (string, error) {
|
func (fs *FSHelper) FindFile(path, match string) (string, error) {
|
||||||
files, err := ioutil.ReadDir(path)
|
files, err := os.ReadDir(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -69,7 +68,7 @@ func (fs *FSHelper) FindFile(path, match string) (string, error) {
|
|||||||
func (fs *FSHelper) CreateFile(filename string, data []byte) error {
|
func (fs *FSHelper) CreateFile(filename string, data []byte) error {
|
||||||
// Ensure directory exists
|
// Ensure directory exists
|
||||||
fs.MkDirs(filepath.Dir(filename))
|
fs.MkDirs(filepath.Dir(filename))
|
||||||
return ioutil.WriteFile(filename, data, 0644)
|
return os.WriteFile(filename, data, 0644)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MkDirs creates the given nested directories.
|
// MkDirs creates the given nested directories.
|
||||||
@@ -149,21 +148,11 @@ func (fs *FSHelper) LocalDir(dir string) (*Dir, error) {
|
|||||||
}, err
|
}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadRelativeFile loads the given file relative to the caller's directory
|
|
||||||
func (fs *FSHelper) LoadRelativeFile(relativePath string) ([]byte, error) {
|
|
||||||
_, filename, _, _ := runtime.Caller(0)
|
|
||||||
fullPath, err := filepath.Abs(filepath.Join(path.Dir(filename), relativePath))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return ioutil.ReadFile(fullPath)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSubdirs will return a list of FQPs to subdirectories in the given directory
|
// GetSubdirs will return a list of FQPs to subdirectories in the given directory
|
||||||
func (d *Dir) GetSubdirs() (map[string]string, error) {
|
func (d *Dir) GetSubdirs() (map[string]string, error) {
|
||||||
|
|
||||||
// Read in the directory information
|
// Read in the directory information
|
||||||
fileInfo, err := ioutil.ReadDir(d.fullPath)
|
fileInfo, err := os.ReadDir(d.fullPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -215,7 +204,7 @@ func (fs *FSHelper) SaveAsJSON(data interface{}, filename string) error {
|
|||||||
e.SetIndent("", " ")
|
e.SetIndent("", " ")
|
||||||
e.Encode(data)
|
e.Encode(data)
|
||||||
|
|
||||||
err := ioutil.WriteFile(filename, buf.Bytes(), 0755)
|
err := os.WriteFile(filename, buf.Bytes(), 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -231,7 +220,7 @@ func (fs *FSHelper) LoadAsString(filename string) (string, error) {
|
|||||||
|
|
||||||
// LoadAsBytes returns the contents of the file as a byte slice
|
// LoadAsBytes returns the contents of the file as a byte slice
|
||||||
func (fs *FSHelper) LoadAsBytes(filename string) ([]byte, error) {
|
func (fs *FSHelper) LoadAsBytes(filename string) ([]byte, error) {
|
||||||
return ioutil.ReadFile(filename)
|
return os.ReadFile(filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FileMD5 returns the md5sum of the given file
|
// FileMD5 returns the md5sum of the given file
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package cmd
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"sort"
|
"sort"
|
||||||
)
|
)
|
||||||
@@ -28,7 +28,7 @@ func (g *GitHubHelper) GetVersionTags() ([]*SemanticVersion, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package cmd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
@@ -75,7 +74,8 @@ const (
|
|||||||
NixOS
|
NixOS
|
||||||
// Artix linux distribution
|
// Artix linux distribution
|
||||||
ArtixLinux
|
ArtixLinux
|
||||||
|
//Uos distribution
|
||||||
|
Uos
|
||||||
)
|
)
|
||||||
|
|
||||||
// DistroInfo contains all the information relating to a linux distribution
|
// DistroInfo contains all the information relating to a linux distribution
|
||||||
@@ -96,7 +96,7 @@ func GetLinuxDistroInfo() *DistroInfo {
|
|||||||
}
|
}
|
||||||
_, err := os.Stat("/etc/os-release")
|
_, err := os.Stat("/etc/os-release")
|
||||||
if !os.IsNotExist(err) {
|
if !os.IsNotExist(err) {
|
||||||
osRelease, _ := ioutil.ReadFile("/etc/os-release")
|
osRelease, _ := os.ReadFile("/etc/os-release")
|
||||||
result = parseOsRelease(string(osRelease))
|
result = parseOsRelease(string(osRelease))
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
@@ -192,6 +192,8 @@ func parseOsRelease(osRelease string) *DistroInfo {
|
|||||||
result.Distribution = NixOS
|
result.Distribution = NixOS
|
||||||
case "artix":
|
case "artix":
|
||||||
result.Distribution = ArtixLinux
|
result.Distribution = ArtixLinux
|
||||||
|
case "uos":
|
||||||
|
result.Distribution = Uos
|
||||||
default:
|
default:
|
||||||
result.Distribution = Unknown
|
result.Distribution = Unknown
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
_ "embed"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//go:embed linuxdb.yaml
|
||||||
|
var LinuxDBYaml []byte
|
||||||
|
|
||||||
// LinuxDB is the database for linux distribution data.
|
// LinuxDB is the database for linux distribution data.
|
||||||
type LinuxDB struct {
|
type LinuxDB struct {
|
||||||
Distributions map[string]*Distribution `yaml:"distributions"`
|
Distributions map[string]*Distribution `yaml:"distributions"`
|
||||||
@@ -78,14 +82,10 @@ func (l *LinuxDB) GetDistro(distro string) *Distribution {
|
|||||||
// NewLinuxDB creates a new LinuxDB instance from the bundled
|
// NewLinuxDB creates a new LinuxDB instance from the bundled
|
||||||
// linuxdb.yaml file.
|
// linuxdb.yaml file.
|
||||||
func NewLinuxDB() *LinuxDB {
|
func NewLinuxDB() *LinuxDB {
|
||||||
data, err := fs.LoadRelativeFile("./linuxdb.yaml")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("Could not load linuxdb.yaml")
|
|
||||||
}
|
|
||||||
result := LinuxDB{
|
result := LinuxDB{
|
||||||
Distributions: make(map[string]*Distribution),
|
Distributions: make(map[string]*Distribution),
|
||||||
}
|
}
|
||||||
err = result.ImportData(data)
|
err := result.ImportData(LinuxDBYaml)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,6 +100,15 @@ distributions:
|
|||||||
gccversioncommand: *gccdumpfullversion
|
gccversioncommand: *gccdumpfullversion
|
||||||
programs: *debiandefaultprograms
|
programs: *debiandefaultprograms
|
||||||
libraries: *debiandefaultlibraries
|
libraries: *debiandefaultlibraries
|
||||||
|
uos:
|
||||||
|
id: uos
|
||||||
|
releases:
|
||||||
|
default:
|
||||||
|
version: default
|
||||||
|
name: Uos
|
||||||
|
gccversioncommand: *gccdumpfullversion
|
||||||
|
programs: *debiandefaultprograms
|
||||||
|
libraries: *debiandefaultlibraries
|
||||||
void:
|
void:
|
||||||
id: void
|
id: void
|
||||||
releases:
|
releases:
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
"image/png"
|
"image/png"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -244,7 +243,7 @@ func (b *PackageHelper) packageOSX(po *ProjectOptions) error {
|
|||||||
// No - create a new plist from our defaults
|
// No - create a new plist from our defaults
|
||||||
tmpl := template.New("infoPlist")
|
tmpl := template.New("infoPlist")
|
||||||
plistFile := filepath.Join(b.getPackageFileBaseDir(), "info.plist")
|
plistFile := filepath.Join(b.getPackageFileBaseDir(), "info.plist")
|
||||||
infoPlist, err := ioutil.ReadFile(plistFile)
|
infoPlist, err := os.ReadFile(plistFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -258,13 +257,13 @@ func (b *PackageHelper) packageOSX(po *ProjectOptions) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Save to the package
|
// Save to the package
|
||||||
err = ioutil.WriteFile(plistFilename, tpl.Bytes(), 0644)
|
err = os.WriteFile(plistFilename, tpl.Bytes(), 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also write to project directory for customisation
|
// Also write to project directory for customisation
|
||||||
err = ioutil.WriteFile(customPlist, tpl.Bytes(), 0644)
|
err = os.WriteFile(customPlist, tpl.Bytes(), 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -314,10 +313,12 @@ func (b *PackageHelper) PackageWindows(po *ProjectOptions, cleanUp bool) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate icon from PNG
|
// Generate icon from PNG if it doesn't exist
|
||||||
err = generateWindowsIcon(icon, basename+".ico")
|
if !fs.FileExists(basename + ".ico") {
|
||||||
if err != nil {
|
err = generateWindowsIcon(icon, basename+".ico")
|
||||||
return err
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy manifest
|
// Copy manifest
|
||||||
@@ -334,12 +335,12 @@ func (b *PackageHelper) PackageWindows(po *ProjectOptions, cleanUp bool) error {
|
|||||||
tgtRCFile := filepath.Join(outputDir, basename+".rc")
|
tgtRCFile := filepath.Join(outputDir, basename+".rc")
|
||||||
if !b.fs.FileExists(tgtRCFile) {
|
if !b.fs.FileExists(tgtRCFile) {
|
||||||
srcRCfile := filepath.Join(b.getPackageFileBaseDir(), "wails.rc")
|
srcRCfile := filepath.Join(b.getPackageFileBaseDir(), "wails.rc")
|
||||||
rcfilebytes, err := ioutil.ReadFile(srcRCfile)
|
rcfilebytes, err := os.ReadFile(srcRCfile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
rcfiledata := strings.Replace(string(rcfilebytes), "$NAME$", basename, -1)
|
rcfiledata := strings.Replace(string(rcfilebytes), "$NAME$", basename, -1)
|
||||||
err = ioutil.WriteFile(tgtRCFile, []byte(rcfiledata), 0755)
|
err = os.WriteFile(tgtRCFile, []byte(rcfiledata), 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -387,11 +388,11 @@ func (b *PackageHelper) copyIcon() (string, error) {
|
|||||||
|
|
||||||
// Install default icon
|
// Install default icon
|
||||||
iconfile := filepath.Join(b.getPackageFileBaseDir(), "icon.png")
|
iconfile := filepath.Join(b.getPackageFileBaseDir(), "icon.png")
|
||||||
iconData, err := ioutil.ReadFile(iconfile)
|
iconData, err := os.ReadFile(iconfile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
err = ioutil.WriteFile(srcIcon, iconData, 0644)
|
err = os.WriteFile(srcIcon, iconData, 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package cmd
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
@@ -310,14 +309,14 @@ func (po *ProjectOptions) WriteProjectConfig() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return ioutil.WriteFile(targetFile, filedata, 0600)
|
return os.WriteFile(targetFile, filedata, 0600)
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadConfig loads the project configuration file from the
|
// LoadConfig loads the project configuration file from the
|
||||||
// given directory
|
// given directory
|
||||||
func (po *ProjectOptions) LoadConfig(projectDir string) error {
|
func (po *ProjectOptions) LoadConfig(projectDir string) error {
|
||||||
targetFile := filepath.Join(projectDir, "project.json")
|
targetFile := filepath.Join(projectDir, "project.json")
|
||||||
rawBytes, err := ioutil.ReadFile(targetFile)
|
rawBytes, err := os.ReadFile(targetFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package cmd
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -124,7 +123,7 @@ func (s *SystemHelper) setup() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = ioutil.WriteFile(s.wailsSystemConfig, configData, 0755)
|
err = os.WriteFile(s.wailsSystemConfig, configData, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -207,11 +206,11 @@ func (sc *SystemConfig) Save(filename string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write it out to the config file
|
// Write it out to the config file
|
||||||
return ioutil.WriteFile(filename, theJSON, 0644)
|
return os.WriteFile(filename, theJSON, 0644)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sc *SystemConfig) load(filename string) error {
|
func (sc *SystemConfig) load(filename string) error {
|
||||||
configData, err := ioutil.ReadFile(filename)
|
configData, err := os.ReadFile(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -279,7 +278,7 @@ func CheckDependencies(logger *Logger) (bool, error) {
|
|||||||
distroInfo := GetLinuxDistroInfo()
|
distroInfo := GetLinuxDistroInfo()
|
||||||
|
|
||||||
switch distroInfo.Distribution {
|
switch distroInfo.Distribution {
|
||||||
case Ubuntu, Debian, Zorin, Parrot, Linuxmint, Elementary, Kali, Neon, Deepin, Raspbian, PopOS:
|
case Ubuntu, Debian, Zorin, Parrot, Linuxmint, Elementary, Kali, Neon, Deepin, Raspbian, PopOS, Uos:
|
||||||
libraryChecker = DpkgInstalled
|
libraryChecker = DpkgInstalled
|
||||||
case Arch, ArcoLinux, ArchLabs, Ctlos, Manjaro, ManjaroARM, EndeavourOS, ArtixLinux:
|
case Arch, ArcoLinux, ArchLabs, Ctlos, Manjaro, ManjaroARM, EndeavourOS, ArtixLinux:
|
||||||
libraryChecker = PacmanInstalled
|
libraryChecker = PacmanInstalled
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -125,7 +125,7 @@ func (t *TemplateHelper) LoadMetadata(dir string) (*TemplateMetadata, error) {
|
|||||||
if !t.fs.FileExists(templateFile) {
|
if !t.fs.FileExists(templateFile) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
rawJSON, err := ioutil.ReadFile(templateFile)
|
rawJSON, err := os.ReadFile(templateFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
// Version - Wails version
|
// Version - Wails version
|
||||||
const Version = "v1.16.7"
|
const Version = "v1.16.9"
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -305,7 +304,7 @@ func updateWailsVersion(currentVersion, latestVersion *semver.Version) error {
|
|||||||
new := fmt.Sprintf("%s v%s", wailsModule, latestVersion)
|
new := fmt.Sprintf("%s v%s", wailsModule, latestVersion)
|
||||||
|
|
||||||
goMod = strings.Replace(goMod, old, new, -1)
|
goMod = strings.Replace(goMod, old, new, -1)
|
||||||
err := ioutil.WriteFile(goModFile, []byte(goMod), 0600)
|
err := os.WriteFile(goModFile, []byte(goMod), 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
checkSpinner.Error()
|
checkSpinner.Error()
|
||||||
return err
|
return err
|
||||||
@@ -343,7 +342,7 @@ func patchMainJS() error {
|
|||||||
newStartLine := `Wails.Init`
|
newStartLine := `Wails.Init`
|
||||||
mainJSContents = strings.Replace(mainJSContents, oldStartLine, newStartLine, -1)
|
mainJSContents = strings.Replace(mainJSContents, oldStartLine, newStartLine, -1)
|
||||||
|
|
||||||
err := ioutil.WriteFile(mainJSFile, []byte(mainJSContents), 0600)
|
err := os.WriteFile(mainJSFile, []byte(mainJSContents), 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
checkSpinner.Error()
|
checkSpinner.Error()
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
@@ -112,7 +112,7 @@ To help you in this process, we will ask for some information, add Go/Wails deta
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
template, _ := ioutil.ReadAll(resp.Body)
|
template, _ := io.ReadAll(resp.Body)
|
||||||
body := string(template)
|
body := string(template)
|
||||||
body = "**Description**\n" + (strings.Split(body, "**Description**")[1])
|
body = "**Description**\n" + (strings.Split(body, "**Description**")[1])
|
||||||
fullURL := "https://github.com/wailsapp/wails/issues/new?"
|
fullURL := "https://github.com/wailsapp/wails/issues/new?"
|
||||||
|
|||||||
2
go.mod
@@ -8,7 +8,6 @@ require (
|
|||||||
github.com/gorilla/websocket v1.4.1
|
github.com/gorilla/websocket v1.4.1
|
||||||
github.com/jackmordaunt/icns v1.0.0
|
github.com/jackmordaunt/icns v1.0.0
|
||||||
github.com/kennygrant/sanitize v1.2.4
|
github.com/kennygrant/sanitize v1.2.4
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
|
||||||
github.com/leaanthony/slicer v1.4.0
|
github.com/leaanthony/slicer v1.4.0
|
||||||
github.com/leaanthony/spinner v0.5.3
|
github.com/leaanthony/spinner v0.5.3
|
||||||
github.com/mattn/go-colorable v0.1.1 // indirect
|
github.com/mattn/go-colorable v0.1.1 // indirect
|
||||||
@@ -17,7 +16,6 @@ require (
|
|||||||
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4
|
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4
|
||||||
github.com/pkg/errors v0.8.1 // indirect
|
github.com/pkg/errors v0.8.1 // indirect
|
||||||
github.com/sirupsen/logrus v1.8.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
github.com/stretchr/objx v0.1.1 // indirect
|
|
||||||
github.com/stretchr/testify v1.3.0 // indirect
|
github.com/stretchr/testify v1.3.0 // indirect
|
||||||
github.com/syossan27/tebata v0.0.0-20180602121909-b283fe4bc5ba
|
github.com/syossan27/tebata v0.0.0-20180602121909-b283fe4bc5ba
|
||||||
golang.org/x/image v0.0.0-20200430140353-33d19683fad8
|
golang.org/x/image v0.0.0-20200430140353-33d19683fad8
|
||||||
|
|||||||
9
go.sum
@@ -21,9 +21,6 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU
|
|||||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||||
github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
|
github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
|
||||||
github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
|
github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
|
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
|
||||||
github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw=
|
github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/leaanthony/slicer v1.4.0 h1:Q9u4w+UBU4WHjXnEDdz+eRLMKF/rnyosRBiqULnc1J8=
|
github.com/leaanthony/slicer v1.4.0 h1:Q9u4w+UBU4WHjXnEDdz+eRLMKF/rnyosRBiqULnc1J8=
|
||||||
@@ -52,12 +49,9 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
|||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
|
|
||||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
|
||||||
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
||||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
@@ -73,15 +67,12 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
|
|||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
|
||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c h1:UIcGWL6/wpCfyGuJnRFJRurA+yj8RrW7Q6x2YMCXt6c=
|
|
||||||
golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik=
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik=
|
||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package binding
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
@@ -144,7 +143,7 @@ export {};`
|
|||||||
|
|
||||||
dir := filepath.Dir(typescriptDefinitionFilename)
|
dir := filepath.Dir(typescriptDefinitionFilename)
|
||||||
os.MkdirAll(dir, 0755)
|
os.MkdirAll(dir, 0755)
|
||||||
return ioutil.WriteFile(typescriptDefinitionFilename, []byte(output.String()), 0755)
|
return os.WriteFile(typescriptDefinitionFilename, []byte(output.String()), 0755)
|
||||||
}
|
}
|
||||||
|
|
||||||
// bind the given struct method
|
// bind the given struct method
|
||||||
|
|||||||
@@ -55,20 +55,20 @@ func (e *Manager) addEventListener(eventName string, callback func(...interface{
|
|||||||
return fmt.Errorf("nil callback bassed to addEventListener")
|
return fmt.Errorf("nil callback bassed to addEventListener")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check event has been registered before
|
|
||||||
if e.listeners[eventName] == nil {
|
|
||||||
e.listeners[eventName] = []*eventListener{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the callback
|
// Create the callback
|
||||||
listener := &eventListener{
|
listener := &eventListener{
|
||||||
callback: callback,
|
callback: callback,
|
||||||
counter: counter,
|
counter: counter,
|
||||||
}
|
}
|
||||||
|
e.mu.Lock()
|
||||||
|
// Check event has been registered before
|
||||||
|
if e.listeners[eventName] == nil {
|
||||||
|
e.listeners[eventName] = []*eventListener{}
|
||||||
|
}
|
||||||
|
|
||||||
// Register listener
|
// Register listener
|
||||||
e.listeners[eventName] = append(e.listeners[eventName], listener)
|
e.listeners[eventName] = append(e.listeners[eventName], listener)
|
||||||
|
e.mu.Unlock()
|
||||||
// All good mate
|
// All good mate
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
sponsors/silver sponsor.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
@@ -15,8 +15,6 @@ The build command processes the Wails project and generates an application binar
|
|||||||
| -ldflags "custom ld flags" | Use given ldflags | |
|
| -ldflags "custom ld flags" | Use given ldflags | |
|
||||||
| -o path/to/binary | Compile to given path/filename | |
|
| -o path/to/binary | Compile to given path/filename | |
|
||||||
| -k | Keep generated assets | |
|
| -k | Keep generated assets | |
|
||||||
| -package | Create a platform specific package | |
|
|
||||||
| -production | Compile in production mode: -ldflags="-w -s" + "-h windows" on Windows | |
|
|
||||||
| -tags | Build tags to pass to Go compiler (quoted and space separated) | |
|
| -tags | Build tags to pass to Go compiler (quoted and space separated) | |
|
||||||
| -upx | Compress final binary with UPX (if installed) | |
|
| -upx | Compress final binary with UPX (if installed) | |
|
||||||
| -upxflags "custom flags" | Flags to pass to upx | |
|
| -upxflags "custom flags" | Flags to pass to upx | |
|
||||||
@@ -36,13 +34,13 @@ The build process is as follows:
|
|||||||
- The frontend is then built. This command is read from the project file `wails.json` under the key `frontend:install` and executed in the `frontend` directory. If this is not defined, it is ignored.
|
- The frontend is then built. This command is read from the project file `wails.json` under the key `frontend:install` and executed in the `frontend` directory. If this is not defined, it is ignored.
|
||||||
- The project directory is checked to see if the `build` directory exists. If not, it is created and default project assets are copied to it.
|
- The project directory is checked to see if the `build` directory exists. If not, it is created and default project assets are copied to it.
|
||||||
- An asset bundle is then created by reading the `html` key from `wails.json` and loading the referenced file. This is then parsed, looking for local Javascript and CSS references. Those files are in turn loaded into memory, converted to C data and saved into the asset bundle located at `build/assets.h`, which also includes the original HTML.
|
- An asset bundle is then created by reading the `html` key from `wails.json` and loading the referenced file. This is then parsed, looking for local Javascript and CSS references. Those files are in turn loaded into memory, converted to C data and saved into the asset bundle located at `build/assets.h`, which also includes the original HTML.
|
||||||
- The application icon is then processed: if there is no `build/appicon.png`, a default icon is copied. On Windows, an `app.ico` file is generated from this png. On Mac, `icons.icns` is generated.
|
- The application icon is then processed: if there is no `build/appicon.png`, a default icon is copied. On Windows,
|
||||||
- If there are icons in the `build/tray` directory, these are processed, converted to C data and saved as `build/trayicons.h`, ready for the compilation step.
|
an `app.ico` file is generated from this png. On Mac, `icons.icns` is generated.
|
||||||
- If there are icons in the `build/dialog` directory, these are processed, converted to C data and saved as `build/userdialogicons.h`, ready for the compilation step.
|
- The platform assets in the `build/<platform>` directory are processed: manifest + icons compiled to a `.syso` file (
|
||||||
- If the `-package` flag is given for a Windows target, the Windows assets in the `build/windows` directory are processed: manifest + icons compiled to a `.syso` file (deleted after compilation).
|
deleted after compilation), `info.plist` copied to `.app` on Mac.
|
||||||
- If we are building a universal binary for Mac, the application is compiled for both `arm64` and `amd64`. The `lipo` tool is then executed to create the universal binary.
|
- If we are building a universal binary for Mac, the application is compiled for both `arm64` and `amd64`. The `lipo`
|
||||||
|
tool is then executed to create the universal binary.
|
||||||
- If we are not building a universal binary for Mac, the application is built using `go build`, using build tags to indicate type of application and build mode (debug/production).
|
- If we are not building a universal binary for Mac, the application is built using `go build`, using build tags to indicate type of application and build mode (debug/production).
|
||||||
- If the `-upx` flag was provided, `upx` is invoked to compress the binary. Custom flags may be provided using the `-upxflags` flag.
|
- If the `-upx` flag was provided, `upx` is invoked to compress the binary. Custom flags may be provided using the `-upxflags` flag.
|
||||||
- If the `package` flag is given for a non Windows target, the application is bundled for the platform. On Mac, this creates a `.app` with the processed icons, the `Info.plist` in `build/darwin` and the compiled binary.
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,14 +2,19 @@ package build
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/colour"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"text/tabwriter"
|
"text/tabwriter"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/cmd/wails/internal"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/gomod"
|
||||||
|
|
||||||
"github.com/wailsapp/wails/v2/internal/system"
|
"github.com/wailsapp/wails/v2/internal/system"
|
||||||
|
|
||||||
"github.com/leaanthony/clir"
|
"github.com/leaanthony/clir"
|
||||||
@@ -34,6 +39,9 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) {
|
|||||||
compilerCommand := "go"
|
compilerCommand := "go"
|
||||||
command.StringFlag("compiler", "Use a different go compiler to build, eg go1.15beta1", &compilerCommand)
|
command.StringFlag("compiler", "Use a different go compiler to build, eg go1.15beta1", &compilerCommand)
|
||||||
|
|
||||||
|
skipModTidy := false
|
||||||
|
command.BoolFlag("m", "Skip mod tidy before compile", &skipModTidy)
|
||||||
|
|
||||||
compress := false
|
compress := false
|
||||||
command.BoolFlag("upx", "Compress final binary with UPX (if installed)", &compress)
|
command.BoolFlag("upx", "Compress final binary with UPX (if installed)", &compress)
|
||||||
|
|
||||||
@@ -42,7 +50,7 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) {
|
|||||||
|
|
||||||
// Setup Platform flag
|
// Setup Platform flag
|
||||||
platform := runtime.GOOS
|
platform := runtime.GOOS
|
||||||
//command.StringFlag("platform", "Platform to target", &platform)
|
command.StringFlag("platform", "Platform to target", &platform)
|
||||||
|
|
||||||
// Verbosity
|
// Verbosity
|
||||||
verbosity := 1
|
verbosity := 1
|
||||||
@@ -72,6 +80,12 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) {
|
|||||||
forceBuild := false
|
forceBuild := false
|
||||||
command.BoolFlag("f", "Force build application", &forceBuild)
|
command.BoolFlag("f", "Force build application", &forceBuild)
|
||||||
|
|
||||||
|
updateGoMod := false
|
||||||
|
command.BoolFlag("u", "Updates go.mod to use the same Wails version as the CLI", &updateGoMod)
|
||||||
|
|
||||||
|
debug := false
|
||||||
|
command.BoolFlag("debug", "Retains debug data in the compiled application", &debug)
|
||||||
|
|
||||||
command.Action(func() error {
|
command.Action(func() error {
|
||||||
|
|
||||||
quiet := verbosity == 0
|
quiet := verbosity == 0
|
||||||
@@ -100,9 +114,10 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) {
|
|||||||
//"linux/arm-7",
|
//"linux/arm-7",
|
||||||
"windows",
|
"windows",
|
||||||
"windows/amd64",
|
"windows/amd64",
|
||||||
|
"windows/arm64",
|
||||||
})
|
})
|
||||||
if !validPlatformArch.Contains(platform) {
|
if !validPlatformArch.Contains(platform) {
|
||||||
return fmt.Errorf("platform %s is not supported", platform)
|
return fmt.Errorf("platform %s is not supported. Platforms supported: %s", platform, validPlatformArch.Join(","))
|
||||||
}
|
}
|
||||||
|
|
||||||
if compress && platform == "darwin/universal" {
|
if compress && platform == "darwin/universal" {
|
||||||
@@ -129,8 +144,8 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if runtime.GOOS == "darwin" && !experimental {
|
if runtime.GOOS == "linux" && !experimental {
|
||||||
return fmt.Errorf("MacOS version coming soon!")
|
return fmt.Errorf("Linux version coming soon!")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Webview2 installer strategy (download by default)
|
// Webview2 installer strategy (download by default)
|
||||||
@@ -152,16 +167,24 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mode := build.Production
|
||||||
|
modeString := "Production"
|
||||||
|
if debug {
|
||||||
|
mode = build.Debug
|
||||||
|
modeString = "Debug"
|
||||||
|
}
|
||||||
|
|
||||||
// Create BuildOptions
|
// Create BuildOptions
|
||||||
buildOptions := &build.Options{
|
buildOptions := &build.Options{
|
||||||
Logger: logger,
|
Logger: logger,
|
||||||
OutputType: outputType,
|
OutputType: outputType,
|
||||||
OutputFile: outputFilename,
|
OutputFile: outputFilename,
|
||||||
CleanBuildDirectory: cleanBuildDirectory,
|
CleanBuildDirectory: cleanBuildDirectory,
|
||||||
Mode: build.Production,
|
Mode: mode,
|
||||||
Pack: !noPackage,
|
Pack: !noPackage,
|
||||||
LDFlags: ldflags,
|
LDFlags: ldflags,
|
||||||
Compiler: compilerCommand,
|
Compiler: compilerCommand,
|
||||||
|
SkipModTidy: skipModTidy,
|
||||||
Verbosity: verbosity,
|
Verbosity: verbosity,
|
||||||
ForceBuild: forceBuild,
|
ForceBuild: forceBuild,
|
||||||
IgnoreFrontend: skipFrontend,
|
IgnoreFrontend: skipFrontend,
|
||||||
@@ -193,6 +216,7 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) {
|
|||||||
fmt.Fprintf(w, "Platform: \t%s\n", buildOptions.Platform)
|
fmt.Fprintf(w, "Platform: \t%s\n", buildOptions.Platform)
|
||||||
fmt.Fprintf(w, "Arch: \t%s\n", buildOptions.Arch)
|
fmt.Fprintf(w, "Arch: \t%s\n", buildOptions.Arch)
|
||||||
fmt.Fprintf(w, "Compiler: \t%s\n", compilerPath)
|
fmt.Fprintf(w, "Compiler: \t%s\n", compilerPath)
|
||||||
|
fmt.Fprintf(w, "Build Mode: \t%s\n", modeString)
|
||||||
fmt.Fprintf(w, "Skip Frontend: \t%t\n", skipFrontend)
|
fmt.Fprintf(w, "Skip Frontend: \t%t\n", skipFrontend)
|
||||||
fmt.Fprintf(w, "Compress: \t%t\n", buildOptions.Compress)
|
fmt.Fprintf(w, "Compress: \t%t\n", buildOptions.Compress)
|
||||||
fmt.Fprintf(w, "Package: \t%t\n", buildOptions.Pack)
|
fmt.Fprintf(w, "Package: \t%t\n", buildOptions.Pack)
|
||||||
@@ -205,6 +229,11 @@ func AddBuildSubcommand(app *clir.Cli, w io.Writer) {
|
|||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
w.Flush()
|
w.Flush()
|
||||||
|
|
||||||
|
err = checkGoModVersion(logger, updateGoMod)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return doBuild(buildOptions)
|
return doBuild(buildOptions)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -228,3 +257,59 @@ func doBuild(buildOptions *build.Options) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkGoModVersion(logger *clilogger.CLILogger, updateGoMod bool) error {
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
gomodFilename := filepath.Join(cwd, "go.mod")
|
||||||
|
gomodData, err := os.ReadFile(gomodFilename)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
outOfSync, err := gomod.GoModOutOfSync(gomodData, internal.Version)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !outOfSync {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
gomodversion, err := gomod.GetWailsVersionFromModFile(gomodData)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if updateGoMod {
|
||||||
|
return syncGoModVersion(cwd)
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Println("Warning: go.mod is using Wails '%s' but the CLI is '%s'. Consider updating your project's `go.mod` file.\n", gomodversion.String(), internal.Version)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func LogGreen(message string, args ...interface{}) {
|
||||||
|
text := fmt.Sprintf(message, args...)
|
||||||
|
println(colour.Green(text))
|
||||||
|
}
|
||||||
|
|
||||||
|
func syncGoModVersion(cwd string) error {
|
||||||
|
gomodFilename := filepath.Join(cwd, "go.mod")
|
||||||
|
gomodData, err := os.ReadFile(gomodFilename)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
outOfSync, err := gomod.GoModOutOfSync(gomodData, internal.Version)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !outOfSync {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
LogGreen("Updating go.mod to use Wails '%s'", internal.Version)
|
||||||
|
newGoData, err := gomod.UpdateGoModVersion(gomodData, internal.Version)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return os.WriteFile(gomodFilename, newGoData, 0755)
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,10 +16,10 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/shlex"
|
||||||
"github.com/wailsapp/wails/v2/cmd/wails/internal"
|
"github.com/wailsapp/wails/v2/cmd/wails/internal"
|
||||||
"github.com/wailsapp/wails/v2/internal/gomod"
|
"github.com/wailsapp/wails/v2/internal/gomod"
|
||||||
|
|
||||||
"github.com/leaanthony/slicer"
|
|
||||||
"github.com/wailsapp/wails/v2/internal/project"
|
"github.com/wailsapp/wails/v2/internal/project"
|
||||||
|
|
||||||
"github.com/pkg/browser"
|
"github.com/pkg/browser"
|
||||||
@@ -63,6 +63,7 @@ type devFlags struct {
|
|||||||
compilerCommand string
|
compilerCommand string
|
||||||
assetDir string
|
assetDir string
|
||||||
extensions string
|
extensions string
|
||||||
|
reloadDirs string
|
||||||
openBrowser bool
|
openBrowser bool
|
||||||
noReload bool
|
noReload bool
|
||||||
wailsjsdir string
|
wailsjsdir string
|
||||||
@@ -72,6 +73,7 @@ type devFlags struct {
|
|||||||
forceBuild bool
|
forceBuild bool
|
||||||
debounceMS int
|
debounceMS int
|
||||||
devServerURL string
|
devServerURL string
|
||||||
|
appargs string
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddSubcommand adds the `dev` command for the Wails application
|
// AddSubcommand adds the `dev` command for the Wails application
|
||||||
@@ -82,8 +84,9 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error {
|
|||||||
flags := defaultDevFlags()
|
flags := defaultDevFlags()
|
||||||
command.StringFlag("ldflags", "optional ldflags", &flags.ldflags)
|
command.StringFlag("ldflags", "optional ldflags", &flags.ldflags)
|
||||||
command.StringFlag("compiler", "Use a different go compiler to build, eg go1.15beta1", &flags.compilerCommand)
|
command.StringFlag("compiler", "Use a different go compiler to build, eg go1.15beta1", &flags.compilerCommand)
|
||||||
command.StringFlag("assetdir", "Serve assets from the given directory", &flags.assetDir)
|
command.StringFlag("assetdir", "Serve assets from the given directory instead of using the provided asset FS", &flags.assetDir)
|
||||||
command.StringFlag("e", "Extensions to trigger rebuilds (comma separated) eg go", &flags.extensions)
|
command.StringFlag("e", "Extensions to trigger rebuilds (comma separated) eg go", &flags.extensions)
|
||||||
|
command.StringFlag("reloaddirs", "Additional directories to trigger reloads (comma separated)", &flags.reloadDirs)
|
||||||
command.BoolFlag("browser", "Open application in browser", &flags.openBrowser)
|
command.BoolFlag("browser", "Open application in browser", &flags.openBrowser)
|
||||||
command.BoolFlag("noreload", "Disable reload on asset change", &flags.noReload)
|
command.BoolFlag("noreload", "Disable reload on asset change", &flags.noReload)
|
||||||
command.StringFlag("wailsjsdir", "Directory to generate the Wails JS modules", &flags.wailsjsdir)
|
command.StringFlag("wailsjsdir", "Directory to generate the Wails JS modules", &flags.wailsjsdir)
|
||||||
@@ -93,6 +96,7 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error {
|
|||||||
command.BoolFlag("f", "Force build application", &flags.forceBuild)
|
command.BoolFlag("f", "Force build application", &flags.forceBuild)
|
||||||
command.IntFlag("debounce", "The amount of time to wait to trigger a reload on change", &flags.debounceMS)
|
command.IntFlag("debounce", "The amount of time to wait to trigger a reload on change", &flags.debounceMS)
|
||||||
command.StringFlag("devserverurl", "The url of the dev server to use", &flags.devServerURL)
|
command.StringFlag("devserverurl", "The url of the dev server to use", &flags.devServerURL)
|
||||||
|
command.StringFlag("appargs", "arguments to pass to the underlying app (quoted and space searated)", &flags.appargs)
|
||||||
|
|
||||||
command.Action(func() error {
|
command.Action(func() error {
|
||||||
// Create logger
|
// Create logger
|
||||||
@@ -111,8 +115,8 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if runtime.GOOS == "darwin" && !experimental {
|
if runtime.GOOS == "linux" && !experimental {
|
||||||
return fmt.Errorf("MacOS version coming soon!")
|
return fmt.Errorf("Linux version coming soon!")
|
||||||
}
|
}
|
||||||
|
|
||||||
cwd, err := os.Getwd()
|
cwd, err := os.Getwd()
|
||||||
@@ -276,7 +280,7 @@ func generateBuildOptions(flags devFlags) *build.Options {
|
|||||||
OutputType: "dev",
|
OutputType: "dev",
|
||||||
Mode: build.Dev,
|
Mode: build.Dev,
|
||||||
Arch: runtime.GOARCH,
|
Arch: runtime.GOARCH,
|
||||||
Pack: false,
|
Pack: true,
|
||||||
Platform: runtime.GOOS,
|
Platform: runtime.GOOS,
|
||||||
LDFlags: flags.ldflags,
|
LDFlags: flags.ldflags,
|
||||||
Compiler: flags.compilerCommand,
|
Compiler: flags.compilerCommand,
|
||||||
@@ -285,10 +289,7 @@ func generateBuildOptions(flags devFlags) *build.Options {
|
|||||||
Verbosity: flags.verbosity,
|
Verbosity: flags.verbosity,
|
||||||
WailsJSDir: flags.wailsjsdir,
|
WailsJSDir: flags.wailsjsdir,
|
||||||
}
|
}
|
||||||
switch runtime.GOOS {
|
|
||||||
case "darwin":
|
|
||||||
result.Pack = false
|
|
||||||
}
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,21 +303,29 @@ func loadAndMergeProjectConfig(cwd string, flags *devFlags) (*project.Project, e
|
|||||||
|
|
||||||
var shouldSaveConfig bool
|
var shouldSaveConfig bool
|
||||||
|
|
||||||
if projectConfig.AssetDirectory == "" && flags.assetDir == "" {
|
|
||||||
return nil, fmt.Errorf("No asset directory provided. Please use -assetdir to indicate which directory contains your built assets.")
|
|
||||||
}
|
|
||||||
|
|
||||||
if flags.assetDir == "" && projectConfig.AssetDirectory != "" {
|
if flags.assetDir == "" && projectConfig.AssetDirectory != "" {
|
||||||
flags.assetDir = projectConfig.AssetDirectory
|
flags.assetDir = projectConfig.AssetDirectory
|
||||||
}
|
}
|
||||||
|
|
||||||
if flags.assetDir != projectConfig.AssetDirectory {
|
if flags.assetDir != projectConfig.AssetDirectory {
|
||||||
projectConfig.AssetDirectory = filepath.ToSlash(flags.assetDir)
|
projectConfig.AssetDirectory = filepath.ToSlash(flags.assetDir)
|
||||||
|
shouldSaveConfig = true
|
||||||
}
|
}
|
||||||
|
|
||||||
flags.assetDir, err = filepath.Abs(flags.assetDir)
|
if flags.assetDir != "" {
|
||||||
if err != nil {
|
flags.assetDir, err = filepath.Abs(flags.assetDir)
|
||||||
return nil, err
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.reloadDirs == "" && projectConfig.ReloadDirectories != "" {
|
||||||
|
flags.reloadDirs = projectConfig.ReloadDirectories
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.reloadDirs != projectConfig.ReloadDirectories {
|
||||||
|
projectConfig.ReloadDirectories = filepath.ToSlash(flags.reloadDirs)
|
||||||
|
shouldSaveConfig = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if flags.devServerURL == defaultDevServerURL && projectConfig.DevServerURL != defaultDevServerURL && projectConfig.DevServerURL != "" {
|
if flags.devServerURL == defaultDevServerURL && projectConfig.DevServerURL != defaultDevServerURL && projectConfig.DevServerURL != "" {
|
||||||
@@ -353,6 +362,10 @@ func loadAndMergeProjectConfig(cwd string, flags *devFlags) (*project.Project, e
|
|||||||
shouldSaveConfig = true
|
shouldSaveConfig = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if flags.appargs == "" && projectConfig.AppArgs != "" {
|
||||||
|
flags.appargs = projectConfig.AppArgs
|
||||||
|
}
|
||||||
|
|
||||||
if shouldSaveConfig {
|
if shouldSaveConfig {
|
||||||
err = projectConfig.Save()
|
err = projectConfig.Save()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -463,16 +476,20 @@ func restartApp(buildOptions *build.Options, debugBinaryProcess *process.Process
|
|||||||
debugBinaryProcess = nil
|
debugBinaryProcess = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parse appargs if any
|
||||||
|
args, err := shlex.Split(flags.appargs)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
buildOptions.Logger.Fatal("Unable to parse appargs: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set environment variables accordingly
|
||||||
|
os.Setenv("loglevel", flags.loglevel)
|
||||||
|
os.Setenv("assetdir", flags.assetDir)
|
||||||
|
os.Setenv("devserverurl", flags.devServerURL)
|
||||||
|
|
||||||
// Start up new binary with correct args
|
// Start up new binary with correct args
|
||||||
args := slicer.StringSlicer{}
|
newProcess := process.NewProcess(appBinary, args...)
|
||||||
args.Add("-loglevel", flags.loglevel)
|
|
||||||
if flags.assetDir != "" {
|
|
||||||
args.Add("-assetdir", flags.assetDir)
|
|
||||||
}
|
|
||||||
if flags.devServerURL != "" {
|
|
||||||
args.Add("-devserverurl", flags.devServerURL)
|
|
||||||
}
|
|
||||||
newProcess := process.NewProcess(appBinary, args.AsSlice()...)
|
|
||||||
err = newProcess.Start(exitCodeChannel)
|
err = newProcess.Start(exitCodeChannel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Remove binary
|
// Remove binary
|
||||||
@@ -496,11 +513,26 @@ func doWatcherLoop(buildOptions *build.Options, debugBinaryProcess *process.Proc
|
|||||||
newBinaryProcess *process.Process
|
newBinaryProcess *process.Process
|
||||||
)
|
)
|
||||||
var extensionsThatTriggerARebuild = sliceToMap(strings.Split(flags.extensions, ","))
|
var extensionsThatTriggerARebuild = sliceToMap(strings.Split(flags.extensions, ","))
|
||||||
|
var dirsThatTriggerAReload []string
|
||||||
|
for _, dir := range strings.Split(flags.reloadDirs, ",") {
|
||||||
|
if dir == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
path, err := filepath.Abs(dir)
|
||||||
|
if err != nil {
|
||||||
|
LogRed("Unable to expand reloadDir '%s': %s", dir, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
dirsThatTriggerAReload = append(dirsThatTriggerAReload, path)
|
||||||
|
}
|
||||||
|
|
||||||
quit := false
|
quit := false
|
||||||
interval := time.Duration(flags.debounceMS) * time.Millisecond
|
interval := time.Duration(flags.debounceMS) * time.Millisecond
|
||||||
timer := time.NewTimer(interval)
|
timer := time.NewTimer(interval)
|
||||||
rebuild := false
|
rebuild := false
|
||||||
reload := false
|
reload := false
|
||||||
|
assetDir := ""
|
||||||
|
changedPaths := map[string]struct{}{}
|
||||||
for quit == false {
|
for quit == false {
|
||||||
//reload := false
|
//reload := false
|
||||||
select {
|
select {
|
||||||
@@ -512,12 +544,13 @@ func doWatcherLoop(buildOptions *build.Options, debugBinaryProcess *process.Proc
|
|||||||
// Check for file writes
|
// Check for file writes
|
||||||
if item.Op&fsnotify.Write == fsnotify.Write {
|
if item.Op&fsnotify.Write == fsnotify.Write {
|
||||||
// Ignore directories
|
// Ignore directories
|
||||||
if fs.DirExists(item.Name) {
|
itemName := item.Name
|
||||||
|
if fs.DirExists(itemName) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterate all file patterns
|
// Iterate all file patterns
|
||||||
ext := filepath.Ext(item.Name)
|
ext := filepath.Ext(itemName)
|
||||||
if ext != "" {
|
if ext != "" {
|
||||||
ext = ext[1:]
|
ext = ext[1:]
|
||||||
if _, exists := extensionsThatTriggerARebuild[ext]; exists {
|
if _, exists := extensionsThatTriggerARebuild[ext]; exists {
|
||||||
@@ -527,9 +560,17 @@ func doWatcherLoop(buildOptions *build.Options, debugBinaryProcess *process.Proc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasPrefix(item.Name, flags.assetDir) {
|
for _, reloadDir := range dirsThatTriggerAReload {
|
||||||
reload = true
|
if strings.HasPrefix(itemName, reloadDir) {
|
||||||
|
reload = true
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !reload {
|
||||||
|
changedPaths[filepath.Dir(itemName)] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
timer.Reset(interval)
|
timer.Reset(interval)
|
||||||
}
|
}
|
||||||
// Check for new directories
|
// Check for new directories
|
||||||
@@ -561,6 +602,35 @@ func doWatcherLoop(buildOptions *build.Options, debugBinaryProcess *process.Proc
|
|||||||
debugBinaryProcess = newBinaryProcess
|
debugBinaryProcess = newBinaryProcess
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if len(changedPaths) != 0 {
|
||||||
|
if assetDir == "" {
|
||||||
|
resp, err := http.Get("http://localhost:34115/wails/assetdir")
|
||||||
|
if err != nil {
|
||||||
|
LogRed("Error during retrieving assetdir: %s", err.Error())
|
||||||
|
} else {
|
||||||
|
content, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
LogRed("Error reading assetdir from devserver: %s", err.Error())
|
||||||
|
} else {
|
||||||
|
assetDir = string(content)
|
||||||
|
}
|
||||||
|
resp.Body.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if assetDir != "" {
|
||||||
|
for path := range changedPaths {
|
||||||
|
if strings.HasPrefix(path, assetDir) {
|
||||||
|
reload = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if len(dirsThatTriggerAReload) == 0 {
|
||||||
|
LogRed("Reloading couldn't be triggered: Please specify -assetdir or -reloaddirs")
|
||||||
|
}
|
||||||
|
|
||||||
|
changedPaths = map[string]struct{}{}
|
||||||
|
}
|
||||||
if reload {
|
if reload {
|
||||||
reload = false
|
reload = false
|
||||||
_, err = http.Get("http://localhost:34115/wails/reload")
|
_, err = http.Get("http://localhost:34115/wails/reload")
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
package generate
|
package generate
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
|
||||||
|
|
||||||
"github.com/wailsapp/wails/v2/cmd/wails/internal/commands/generate/template"
|
"github.com/wailsapp/wails/v2/cmd/wails/internal/commands/generate/template"
|
||||||
|
"io"
|
||||||
|
|
||||||
"github.com/leaanthony/clir"
|
"github.com/leaanthony/clir"
|
||||||
)
|
)
|
||||||
@@ -17,6 +16,7 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
template.AddSubCommand(app, command, w)
|
template.AddSubCommand(app, command, w)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ The next steps to complete the template are:
|
|||||||
- It is really important to ensure `helpurl` is valid as this is where users of the template will be directed for help.
|
- It is really important to ensure `helpurl` is valid as this is where users of the template will be directed for help.
|
||||||
2. Update `README.md`.
|
2. Update `README.md`.
|
||||||
3. Edit `wails.json` and ensure all fields are correct, especially:
|
3. Edit `wails.json` and ensure all fields are correct, especially:
|
||||||
- `assetdir` - path to your assets
|
|
||||||
- `wailsjsdir` - path to generate wailsjs modules
|
- `wailsjsdir` - path to generate wailsjs modules
|
||||||
- `frontend:install` - The command to install your frontend dependencies
|
- `frontend:install` - The command to install your frontend dependencies
|
||||||
- `frontend:build` - The command to build your frontend
|
- `frontend:build` - The command to build your frontend
|
||||||
|
|||||||
@@ -4,13 +4,12 @@
|
|||||||
|
|
||||||
About your template
|
About your template
|
||||||
|
|
||||||
## Building
|
|
||||||
|
|
||||||
To build this project in debug mode, use `wails build`. For production, use `wails build -production`.
|
|
||||||
To generate a platform native package, add the `-package` flag.
|
|
||||||
|
|
||||||
## Live Development
|
## Live Development
|
||||||
|
|
||||||
To run in live development mode, run `wails dev` in the project directory. In another terminal, go into the `frontend`
|
To run in live development mode, run `wails dev` in the project directory. In another terminal, go into the `frontend`
|
||||||
directory and run `npm run dev`. The frontend dev server will run on http://localhost:34115. Connect to this
|
directory and run `npm run dev`. The frontend dev server will run on http://localhost:34115. Connect to this in your
|
||||||
in your browser and connect to your application.
|
browser and connect to your application.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
To build a redistributable, production mode package, use `wails build`.
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ github.com/leaanthony/go-common-file-dialog v1.0.3 // indirect
|
|||||||
github.com/leaanthony/go-webview2 v0.0.0-20210914103035-f00aa774a934 // indirect
|
github.com/leaanthony/go-webview2 v0.0.0-20210914103035-f00aa774a934 // indirect
|
||||||
github.com/leaanthony/slicer v1.5.0 // indirect
|
github.com/leaanthony/slicer v1.5.0 // indirect
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7 // indirect
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7 // indirect
|
||||||
github.com/leaanthony/webview2runtime v1.1.0 // indirect
|
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 // indirect
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 // indirect
|
||||||
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 // indirect
|
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
|||||||
@@ -90,8 +90,6 @@ github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0H
|
|||||||
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
|
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7 h1:yoznzWzyxkO/iWdlpq+aPcuJ5Y/hpjq/lmgMFmpjwl0=
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7 h1:yoznzWzyxkO/iWdlpq+aPcuJ5Y/hpjq/lmgMFmpjwl0=
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7/go.mod h1:cWtOkiVhMF77e6phAXUcfNwYmMwCJ67Sij24lfvi9Js=
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7/go.mod h1:cWtOkiVhMF77e6phAXUcfNwYmMwCJ67Sij24lfvi9Js=
|
||||||
github.com/leaanthony/webview2runtime v1.1.0 h1:N0pv55ift8XtqozIp4PNOtRCJ/Qdd/qzx80lUpalS4c=
|
|
||||||
github.com/leaanthony/webview2runtime v1.1.0/go.mod h1:hH9GnWCve3DYzNaPOcPbhHQ7fodXR1QJNsnwixid4Tk=
|
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 h1:5iOd93PZbpH4Iir8QkC4coFD+zEQEZSIRcjwjTFZkr0=
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 h1:5iOd93PZbpH4Iir8QkC4coFD+zEQEZSIRcjwjTFZkr0=
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18/go.mod h1:KEbMsKoznsebyGHwLk5LqkFOxL5uXSRdvpP4+avmAMs=
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18/go.mod h1:KEbMsKoznsebyGHwLk5LqkFOxL5uXSRdvpP4+avmAMs=
|
||||||
github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU=
|
github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU=
|
||||||
|
|||||||
@@ -33,10 +33,10 @@ func main() {
|
|||||||
HideWindowOnClose: false,
|
HideWindowOnClose: false,
|
||||||
RGBA: &options.RGBA{255, 255, 255, 255},
|
RGBA: &options.RGBA{255, 255, 255, 255},
|
||||||
Assets: assets,
|
Assets: assets,
|
||||||
LogLevel: logger.DEBUG,
|
LogLevel: logger.DEBUG,
|
||||||
OnStartup: app.startup,
|
OnStartup: app.startup,
|
||||||
OnDomReady: app.domReady,
|
OnDomReady: app.domReady,
|
||||||
OnShutdown: app.shutdown,
|
OnShutdown: app.shutdown,
|
||||||
Bind: []interface{}{
|
Bind: []interface{}{
|
||||||
app,
|
app,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "{{.ProjectName}}",
|
||||||
|
"author": "",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"install": "go install github.com/wailsapp/wails/v2/cmd/wails@latest",
|
||||||
|
"build": "wails build --clean",
|
||||||
|
"build:macos": "npm run build -- --platform darwin/universal",
|
||||||
|
"build:macos-arm": "npm run build -- --platform darwin/arm64",
|
||||||
|
"build:macos-intel": "npm run build -- --platform darwin",
|
||||||
|
"build:windows": "npm run build -- --platform windows/amd64"
|
||||||
|
},
|
||||||
|
"workspaces": [
|
||||||
|
"frontend"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "{{.ProjectName}}",
|
"name": "{{.ProjectName}}",
|
||||||
"outputfilename": "{{.BinaryName}}",
|
"outputfilename": "{{.BinaryName}}",
|
||||||
"assetdir": "frontend/dist",
|
|
||||||
"frontend:install": "npm install",
|
"frontend:install": "npm install",
|
||||||
"frontend:build": "npm run build",
|
"frontend:build": "npm run build",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -158,18 +158,17 @@ func processPackageJSON(frontendDir string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
data, err := os.ReadFile(packageJSON)
|
json, err := os.ReadFile(packageJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
json := string(data)
|
|
||||||
|
|
||||||
// We will ignore these errors - it's not critical
|
// We will ignore these errors - it's not critical
|
||||||
println("Updating package.json data...")
|
println("Updating package.json data...")
|
||||||
json, _ = sjson.Set(json, "name", "{{.ProjectName}}")
|
json, _ = sjson.SetBytes(json, "name", "{{.ProjectName}}")
|
||||||
json, _ = sjson.Set(json, "author", "{{.AuthorName}}")
|
json, _ = sjson.SetBytes(json, "author", "{{.AuthorName}}")
|
||||||
|
|
||||||
err = os.WriteFile(packageJSON, []byte(json), 0644)
|
err = os.WriteFile(packageJSON, json, 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
<working_directory value="$PROJECT_DIR$"/>
|
<working_directory value="$PROJECT_DIR$"/>
|
||||||
<go_parameters value="-gcflags "all=-N -l" -tags dev -o {{.PathToDesktopBinary}}"/>
|
<go_parameters value="-gcflags "all=-N -l" -tags dev -o {{.PathToDesktopBinary}}"/>
|
||||||
<useCustomBuildTags value="true"/>
|
<useCustomBuildTags value="true"/>
|
||||||
<parameters value="-assetdir {{.AssetDir}}"/>
|
|
||||||
<envs>
|
<envs>
|
||||||
<env name="CGO_ENABLED" value=""{{.CGOEnabled}}""/>
|
<env name="CGO_ENABLED" value=""{{.CGOEnabled}}""/>
|
||||||
</envs>
|
</envs>
|
||||||
|
|||||||
@@ -9,11 +9,7 @@
|
|||||||
"program": "${workspaceFolder}/{{.PathToDesktopBinary}}",
|
"program": "${workspaceFolder}/{{.PathToDesktopBinary}}",
|
||||||
"preLaunchTask": "build",
|
"preLaunchTask": "build",
|
||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
"env": {},
|
"env": {}
|
||||||
"args": [
|
|
||||||
"-assetdir",
|
|
||||||
"{{.AssetDir}}"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -4,15 +4,14 @@ import (
|
|||||||
"embed"
|
"embed"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/go-git/go-git/v5"
|
|
||||||
gofs "io/fs"
|
gofs "io/fs"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-git/go-git/v5"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/leaanthony/debme"
|
"github.com/leaanthony/debme"
|
||||||
@@ -43,7 +42,6 @@ type Data struct {
|
|||||||
AuthorNameAndEmail string
|
AuthorNameAndEmail string
|
||||||
WailsDirectory string
|
WailsDirectory string
|
||||||
GoSDKPath string
|
GoSDKPath string
|
||||||
AssetDir string
|
|
||||||
WindowsFlags string
|
WindowsFlags string
|
||||||
CGOEnabled string
|
CGOEnabled string
|
||||||
OutputFile string
|
OutputFile string
|
||||||
@@ -61,7 +59,6 @@ type Options struct {
|
|||||||
InitGit bool
|
InitGit bool
|
||||||
AuthorName string
|
AuthorName string
|
||||||
AuthorEmail string
|
AuthorEmail string
|
||||||
AssetDir string
|
|
||||||
IDE string
|
IDE string
|
||||||
ProjectNameFilename string // The project name but as a valid filename
|
ProjectNameFilename string // The project name but as a valid filename
|
||||||
WailsVersion string
|
WailsVersion string
|
||||||
@@ -262,7 +259,6 @@ func Install(options *Options) (bool, *Template, error) {
|
|||||||
AuthorName: options.AuthorName,
|
AuthorName: options.AuthorName,
|
||||||
WailsVersion: options.WailsVersion,
|
WailsVersion: options.WailsVersion,
|
||||||
GoSDKPath: options.GoSDKPath,
|
GoSDKPath: options.GoSDKPath,
|
||||||
AssetDir: options.AssetDir,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a formatted name and email combo.
|
// Create a formatted name and email combo.
|
||||||
@@ -295,7 +291,7 @@ func Install(options *Options) (bool, *Template, error) {
|
|||||||
// Clones the given uri and returns the temporary cloned directory
|
// Clones the given uri and returns the temporary cloned directory
|
||||||
func gitclone(options *Options) (string, error) {
|
func gitclone(options *Options) (string, error) {
|
||||||
// Create temporary directory
|
// Create temporary directory
|
||||||
dirname, err := ioutil.TempDir("", "wails-template-*")
|
dirname, err := os.MkdirTemp("", "wails-template-*")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -409,22 +405,6 @@ func installIDEFiles(o ideOptions) error {
|
|||||||
binaryName += ".exe"
|
binaryName += ".exe"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse wails.json for assetdir
|
|
||||||
wailsJSONBytes, err := os.ReadFile(filepath.Join(o.options.TargetDir, "wails.json"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var wailsJSON map[string]interface{}
|
|
||||||
err = json.Unmarshal(wailsJSONBytes, &wailsJSON)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
assetDir := wailsJSON["assetdir"]
|
|
||||||
if assetDir == "" {
|
|
||||||
return fmt.Errorf("Unable to find 'assetdir' in 'wails.json' ")
|
|
||||||
}
|
|
||||||
|
|
||||||
o.options.AssetDir = assetDir.(string)
|
|
||||||
o.options.PathToDesktopBinary = filepath.ToSlash(filepath.Join("build", "bin", binaryName))
|
o.options.PathToDesktopBinary = filepath.ToSlash(filepath.Join("build", "bin", binaryName))
|
||||||
|
|
||||||
o.options.WindowsFlags = ""
|
o.options.WindowsFlags = ""
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
html {
|
html {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: white;
|
color: white;
|
||||||
background-color: rgba(0, 0, 0, 255);
|
background-color: rgba(33, 37, 43, 0.2);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ github.com/leaanthony/go-common-file-dialog v1.0.3 // indirect
|
|||||||
github.com/leaanthony/go-webview2 v0.0.0-20210914103035-f00aa774a934 // indirect
|
github.com/leaanthony/go-webview2 v0.0.0-20210914103035-f00aa774a934 // indirect
|
||||||
github.com/leaanthony/slicer v1.5.0 // indirect
|
github.com/leaanthony/slicer v1.5.0 // indirect
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7 // indirect
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7 // indirect
|
||||||
github.com/leaanthony/webview2runtime v1.1.0 // indirect
|
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 // indirect
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 // indirect
|
||||||
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 // indirect
|
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
|||||||
@@ -91,8 +91,6 @@ github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0H
|
|||||||
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
|
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7 h1:yoznzWzyxkO/iWdlpq+aPcuJ5Y/hpjq/lmgMFmpjwl0=
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7 h1:yoznzWzyxkO/iWdlpq+aPcuJ5Y/hpjq/lmgMFmpjwl0=
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7/go.mod h1:cWtOkiVhMF77e6phAXUcfNwYmMwCJ67Sij24lfvi9Js=
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7/go.mod h1:cWtOkiVhMF77e6phAXUcfNwYmMwCJ67Sij24lfvi9Js=
|
||||||
github.com/leaanthony/webview2runtime v1.1.0 h1:N0pv55ift8XtqozIp4PNOtRCJ/Qdd/qzx80lUpalS4c=
|
|
||||||
github.com/leaanthony/webview2runtime v1.1.0/go.mod h1:hH9GnWCve3DYzNaPOcPbhHQ7fodXR1QJNsnwixid4Tk=
|
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 h1:5iOd93PZbpH4Iir8QkC4coFD+zEQEZSIRcjwjTFZkr0=
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 h1:5iOd93PZbpH4Iir8QkC4coFD+zEQEZSIRcjwjTFZkr0=
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18/go.mod h1:KEbMsKoznsebyGHwLk5LqkFOxL5uXSRdvpP4+avmAMs=
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18/go.mod h1:KEbMsKoznsebyGHwLk5LqkFOxL5uXSRdvpP4+avmAMs=
|
||||||
github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU=
|
github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU=
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import (
|
|||||||
"embed"
|
"embed"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/options/mac"
|
||||||
|
|
||||||
"github.com/wailsapp/wails/v2"
|
"github.com/wailsapp/wails/v2"
|
||||||
"github.com/wailsapp/wails/v2/pkg/logger"
|
"github.com/wailsapp/wails/v2/pkg/logger"
|
||||||
"github.com/wailsapp/wails/v2/pkg/options"
|
"github.com/wailsapp/wails/v2/pkg/options"
|
||||||
@@ -13,6 +15,9 @@ import (
|
|||||||
//go:embed frontend/dist
|
//go:embed frontend/dist
|
||||||
var assets embed.FS
|
var assets embed.FS
|
||||||
|
|
||||||
|
//go:embed build/appicon.png
|
||||||
|
var icon []byte
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Create an instance of the app structure
|
// Create an instance of the app structure
|
||||||
app := NewApp()
|
app := NewApp()
|
||||||
@@ -31,7 +36,7 @@ func main() {
|
|||||||
Frameless: false,
|
Frameless: false,
|
||||||
StartHidden: false,
|
StartHidden: false,
|
||||||
HideWindowOnClose: false,
|
HideWindowOnClose: false,
|
||||||
RGBA: &options.RGBA{R: 255, G: 255, B: 255, A: 255},
|
RGBA: &options.RGBA{R: 33, G: 37, B: 43, A: 255},
|
||||||
Assets: assets,
|
Assets: assets,
|
||||||
LogLevel: logger.DEBUG,
|
LogLevel: logger.DEBUG,
|
||||||
OnStartup: app.startup,
|
OnStartup: app.startup,
|
||||||
@@ -46,6 +51,17 @@ func main() {
|
|||||||
WindowIsTranslucent: false,
|
WindowIsTranslucent: false,
|
||||||
DisableWindowIcon: false,
|
DisableWindowIcon: false,
|
||||||
},
|
},
|
||||||
|
Mac: &mac.Options{
|
||||||
|
TitleBar: mac.TitleBarHiddenInset(),
|
||||||
|
Appearance: mac.NSAppearanceNameDarkAqua,
|
||||||
|
WebviewIsTransparent: true,
|
||||||
|
WindowIsTranslucent: true,
|
||||||
|
About: &mac.AboutInfo{
|
||||||
|
Title: "My Application",
|
||||||
|
Message: "© 2021 Me",
|
||||||
|
Icon: icon,
|
||||||
|
},
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"name": "{{.ProjectName}}",
|
"name": "{{.ProjectName}}",
|
||||||
"outputfilename": "{{.BinaryName}}",
|
"outputfilename": "{{.BinaryName}}",
|
||||||
"assetdir": "frontend/dist",
|
|
||||||
"frontend:install": "npm install",
|
"frontend:install": "npm install",
|
||||||
"frontend:build": "npm run build",
|
"frontend:build": "npm run build",
|
||||||
|
"wailsjsdir": "./frontend",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "{{.AuthorName}}",
|
"name": "{{.AuthorName}}",
|
||||||
"email": "{{.AuthorEmail}}"
|
"email": "{{.AuthorEmail}}"
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
html {
|
html {
|
||||||
background-color: rgba(33, 37, 43, 1);
|
background-color: rgba(33, 37, 43, 0.2);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: white;
|
|
||||||
font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
|
font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
|
||||||
"Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
|
"Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
|
||||||
sans-serif;
|
sans-serif;
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ github.com/leaanthony/go-common-file-dialog v1.0.3 // indirect
|
|||||||
github.com/leaanthony/go-webview2 v0.0.0-20210914103035-f00aa774a934 // indirect
|
github.com/leaanthony/go-webview2 v0.0.0-20210914103035-f00aa774a934 // indirect
|
||||||
github.com/leaanthony/slicer v1.5.0 // indirect
|
github.com/leaanthony/slicer v1.5.0 // indirect
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7 // indirect
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7 // indirect
|
||||||
github.com/leaanthony/webview2runtime v1.1.0 // indirect
|
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 // indirect
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 // indirect
|
||||||
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 // indirect
|
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
|||||||
@@ -91,8 +91,6 @@ github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0H
|
|||||||
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
|
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7 h1:yoznzWzyxkO/iWdlpq+aPcuJ5Y/hpjq/lmgMFmpjwl0=
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7 h1:yoznzWzyxkO/iWdlpq+aPcuJ5Y/hpjq/lmgMFmpjwl0=
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7/go.mod h1:cWtOkiVhMF77e6phAXUcfNwYmMwCJ67Sij24lfvi9Js=
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7/go.mod h1:cWtOkiVhMF77e6phAXUcfNwYmMwCJ67Sij24lfvi9Js=
|
||||||
github.com/leaanthony/webview2runtime v1.1.0 h1:N0pv55ift8XtqozIp4PNOtRCJ/Qdd/qzx80lUpalS4c=
|
|
||||||
github.com/leaanthony/webview2runtime v1.1.0/go.mod h1:hH9GnWCve3DYzNaPOcPbhHQ7fodXR1QJNsnwixid4Tk=
|
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 h1:5iOd93PZbpH4Iir8QkC4coFD+zEQEZSIRcjwjTFZkr0=
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 h1:5iOd93PZbpH4Iir8QkC4coFD+zEQEZSIRcjwjTFZkr0=
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18/go.mod h1:KEbMsKoznsebyGHwLk5LqkFOxL5uXSRdvpP4+avmAMs=
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18/go.mod h1:KEbMsKoznsebyGHwLk5LqkFOxL5uXSRdvpP4+avmAMs=
|
||||||
github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU=
|
github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU=
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import (
|
|||||||
"embed"
|
"embed"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/options/mac"
|
||||||
|
|
||||||
"github.com/wailsapp/wails/v2"
|
"github.com/wailsapp/wails/v2"
|
||||||
"github.com/wailsapp/wails/v2/pkg/logger"
|
"github.com/wailsapp/wails/v2/pkg/logger"
|
||||||
"github.com/wailsapp/wails/v2/pkg/options"
|
"github.com/wailsapp/wails/v2/pkg/options"
|
||||||
@@ -13,6 +15,9 @@ import (
|
|||||||
//go:embed frontend/src
|
//go:embed frontend/src
|
||||||
var assets embed.FS
|
var assets embed.FS
|
||||||
|
|
||||||
|
//go:embed build/appicon.png
|
||||||
|
var icon []byte
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Create an instance of the app structure
|
// Create an instance of the app structure
|
||||||
app := NewApp()
|
app := NewApp()
|
||||||
@@ -31,7 +36,7 @@ func main() {
|
|||||||
Frameless: false,
|
Frameless: false,
|
||||||
StartHidden: false,
|
StartHidden: false,
|
||||||
HideWindowOnClose: false,
|
HideWindowOnClose: false,
|
||||||
RGBA: &options.RGBA{R: 255, G: 255, B: 255, A: 255},
|
RGBA: &options.RGBA{R: 33, G: 37, B: 43, A: 255},
|
||||||
Assets: assets,
|
Assets: assets,
|
||||||
LogLevel: logger.DEBUG,
|
LogLevel: logger.DEBUG,
|
||||||
OnStartup: app.startup,
|
OnStartup: app.startup,
|
||||||
@@ -46,6 +51,16 @@ func main() {
|
|||||||
WindowIsTranslucent: false,
|
WindowIsTranslucent: false,
|
||||||
DisableWindowIcon: false,
|
DisableWindowIcon: false,
|
||||||
},
|
},
|
||||||
|
Mac: &mac.Options{
|
||||||
|
TitleBar: mac.TitleBarHiddenInset(),
|
||||||
|
WebviewIsTransparent: true,
|
||||||
|
WindowIsTranslucent: true,
|
||||||
|
About: &mac.AboutInfo{
|
||||||
|
Title: "Vanilla Template",
|
||||||
|
Message: "Part of the Wails projects",
|
||||||
|
Icon: icon,
|
||||||
|
},
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "{{.ProjectName}}",
|
"name": "{{.ProjectName}}",
|
||||||
"outputfilename": "{{.BinaryName}}",
|
"outputfilename": "{{.BinaryName}}",
|
||||||
"assetdir": "frontend/src",
|
"wailsjsdir": "./frontend",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "{{.AuthorName}}",
|
"name": "{{.AuthorName}}",
|
||||||
"email": "{{.AuthorEmail}}"
|
"email": "{{.AuthorEmail}}"
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
package internal
|
package internal
|
||||||
|
|
||||||
var Version = "v2.0.0-beta.15"
|
var Version = "v2.0.0-beta.27"
|
||||||
|
|||||||
12
v2/go.mod
@@ -13,6 +13,7 @@ require (
|
|||||||
github.com/gofiber/fiber/v2 v2.17.0
|
github.com/gofiber/fiber/v2 v2.17.0
|
||||||
github.com/gofiber/websocket/v2 v2.0.8
|
github.com/gofiber/websocket/v2 v2.0.8
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
|
||||||
github.com/google/uuid v1.1.2 // indirect
|
github.com/google/uuid v1.1.2 // indirect
|
||||||
github.com/gorilla/websocket v1.4.1
|
github.com/gorilla/websocket v1.4.1
|
||||||
github.com/imdario/mergo v0.3.12
|
github.com/imdario/mergo v0.3.12
|
||||||
@@ -21,13 +22,12 @@ require (
|
|||||||
github.com/leaanthony/debme v1.2.1
|
github.com/leaanthony/debme v1.2.1
|
||||||
github.com/leaanthony/go-ansi-parser v1.0.1
|
github.com/leaanthony/go-ansi-parser v1.0.1
|
||||||
github.com/leaanthony/go-common-file-dialog v1.0.3
|
github.com/leaanthony/go-common-file-dialog v1.0.3
|
||||||
github.com/leaanthony/go-webview2 v0.0.0-20211022194343-1e4c8d4226f3
|
github.com/leaanthony/go-webview2 v1.0.2
|
||||||
github.com/leaanthony/gosod v1.0.3
|
github.com/leaanthony/gosod v1.0.3
|
||||||
github.com/leaanthony/idgen v1.0.0
|
github.com/leaanthony/idgen v1.0.0
|
||||||
github.com/leaanthony/slicer v1.5.0
|
github.com/leaanthony/slicer v1.5.0
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7
|
||||||
github.com/leaanthony/webview2runtime v1.1.0
|
github.com/leaanthony/winc v0.0.0-20211202091710-9931d43181ff
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18
|
|
||||||
github.com/leaanthony/winicon v1.0.0
|
github.com/leaanthony/winicon v1.0.0
|
||||||
github.com/matryer/is v1.4.0
|
github.com/matryer/is v1.4.0
|
||||||
github.com/olekukonko/tablewriter v0.0.4
|
github.com/olekukonko/tablewriter v0.0.4
|
||||||
@@ -39,11 +39,10 @@ require (
|
|||||||
github.com/tdewolff/test v1.0.6 // indirect
|
github.com/tdewolff/test v1.0.6 // indirect
|
||||||
github.com/tidwall/sjson v1.1.7
|
github.com/tidwall/sjson v1.1.7
|
||||||
github.com/wzshiming/ctc v1.2.3
|
github.com/wzshiming/ctc v1.2.3
|
||||||
github.com/xyproto/xpm v1.2.1
|
|
||||||
github.com/ztrue/tracerr v0.3.0
|
github.com/ztrue/tracerr v0.3.0
|
||||||
golang.org/x/mod v0.4.1
|
golang.org/x/mod v0.4.1
|
||||||
golang.org/x/net v0.0.0-20210510120150-4163338589ed
|
golang.org/x/net v0.0.0-20210510120150-4163338589ed
|
||||||
golang.org/x/sys v0.0.0-20211020174200-9d6173849985
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e
|
||||||
golang.org/x/tools v0.1.0
|
golang.org/x/tools v0.1.0
|
||||||
nhooyr.io/websocket v1.8.6
|
nhooyr.io/websocket v1.8.6
|
||||||
)
|
)
|
||||||
@@ -54,12 +53,13 @@ require (
|
|||||||
github.com/emirpasic/gods v1.12.0 // indirect
|
github.com/emirpasic/gods v1.12.0 // indirect
|
||||||
github.com/fasthttp/websocket v0.0.0-20200320073529-1554a54587ab // indirect
|
github.com/fasthttp/websocket v0.0.0-20200320073529-1554a54587ab // indirect
|
||||||
github.com/go-git/gcfg v1.5.0 // indirect
|
github.com/go-git/gcfg v1.5.0 // indirect
|
||||||
github.com/go-ole/go-ole v1.2.5 // indirect
|
github.com/go-ole/go-ole v1.2.6 // indirect
|
||||||
github.com/google/go-cmp v0.5.5 // indirect
|
github.com/google/go-cmp v0.5.5 // indirect
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
||||||
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
|
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
|
||||||
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
|
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
|
||||||
github.com/klauspost/compress v1.12.2 // indirect
|
github.com/klauspost/compress v1.12.2 // indirect
|
||||||
|
github.com/kr/pretty v0.3.0 // indirect
|
||||||
github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e // indirect
|
github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.7 // indirect
|
github.com/mattn/go-runewidth v0.0.7 // indirect
|
||||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
|
|||||||
32
v2/go.sum
@@ -45,8 +45,8 @@ github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod
|
|||||||
github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc=
|
github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc=
|
||||||
github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw=
|
github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw=
|
||||||
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
|
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
|
||||||
github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
|
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
||||||
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||||
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
|
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
|
||||||
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
||||||
@@ -75,6 +75,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
@@ -101,8 +103,9 @@ github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8
|
|||||||
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
|
||||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
|
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||||
|
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
@@ -115,8 +118,8 @@ github.com/leaanthony/go-ansi-parser v1.0.1 h1:97v6c5kYppVsbScf4r/VZdXyQ21KQIfeQ
|
|||||||
github.com/leaanthony/go-ansi-parser v1.0.1/go.mod h1:7arTzgVI47srICYhvgUV4CGd063sGEeoSlych5yeSPM=
|
github.com/leaanthony/go-ansi-parser v1.0.1/go.mod h1:7arTzgVI47srICYhvgUV4CGd063sGEeoSlych5yeSPM=
|
||||||
github.com/leaanthony/go-common-file-dialog v1.0.3 h1:O0uGjKnWtdEADGrkg+TyAAbZylykMwwx/MNEXn9fp+Y=
|
github.com/leaanthony/go-common-file-dialog v1.0.3 h1:O0uGjKnWtdEADGrkg+TyAAbZylykMwwx/MNEXn9fp+Y=
|
||||||
github.com/leaanthony/go-common-file-dialog v1.0.3/go.mod h1:TGhEc9eSJgRsupZ+iH1ZgAOnEo9zp05cRH2j08RPrF0=
|
github.com/leaanthony/go-common-file-dialog v1.0.3/go.mod h1:TGhEc9eSJgRsupZ+iH1ZgAOnEo9zp05cRH2j08RPrF0=
|
||||||
github.com/leaanthony/go-webview2 v0.0.0-20211022194343-1e4c8d4226f3 h1:qhgrg3MhFRAIvtaqoqI+SrT+0wDYpxDMp9e3cvcxMpI=
|
github.com/leaanthony/go-webview2 v1.0.2 h1:IjTbpAXUig33G3LUqf+8EClZutg2Z/C1cbxqhHKPxbU=
|
||||||
github.com/leaanthony/go-webview2 v0.0.0-20211022194343-1e4c8d4226f3/go.mod h1:lS5ds4bruPk9d7lzdF/OH31Z0YCerI6MmHNFGsWoUnM=
|
github.com/leaanthony/go-webview2 v1.0.2/go.mod h1:iX54IaVk1FnDqMuHJ47VYLPQOcVqQiOe9SJACt9CAbU=
|
||||||
github.com/leaanthony/gosod v1.0.3 h1:Fnt+/B6NjQOVuCWOKYRREZnjGyvg+mEhd1nkkA04aTQ=
|
github.com/leaanthony/gosod v1.0.3 h1:Fnt+/B6NjQOVuCWOKYRREZnjGyvg+mEhd1nkkA04aTQ=
|
||||||
github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4=
|
github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4=
|
||||||
github.com/leaanthony/idgen v1.0.0 h1:IZreR+JGEzFV4yeVuBZA25gM0keUoFy+RDUldncQ+Jw=
|
github.com/leaanthony/idgen v1.0.0 h1:IZreR+JGEzFV4yeVuBZA25gM0keUoFy+RDUldncQ+Jw=
|
||||||
@@ -125,10 +128,8 @@ github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0H
|
|||||||
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
|
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7 h1:yoznzWzyxkO/iWdlpq+aPcuJ5Y/hpjq/lmgMFmpjwl0=
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7 h1:yoznzWzyxkO/iWdlpq+aPcuJ5Y/hpjq/lmgMFmpjwl0=
|
||||||
github.com/leaanthony/typescriptify-golang-structs v0.1.7/go.mod h1:cWtOkiVhMF77e6phAXUcfNwYmMwCJ67Sij24lfvi9Js=
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7/go.mod h1:cWtOkiVhMF77e6phAXUcfNwYmMwCJ67Sij24lfvi9Js=
|
||||||
github.com/leaanthony/webview2runtime v1.1.0 h1:N0pv55ift8XtqozIp4PNOtRCJ/Qdd/qzx80lUpalS4c=
|
github.com/leaanthony/winc v0.0.0-20211202091710-9931d43181ff h1:FwGObElCr/T/xy8S9IKDjWsNcfJHGxgjRl/GIbcseoQ=
|
||||||
github.com/leaanthony/webview2runtime v1.1.0/go.mod h1:hH9GnWCve3DYzNaPOcPbhHQ7fodXR1QJNsnwixid4Tk=
|
github.com/leaanthony/winc v0.0.0-20211202091710-9931d43181ff/go.mod h1:KEbMsKoznsebyGHwLk5LqkFOxL5uXSRdvpP4+avmAMs=
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 h1:5iOd93PZbpH4Iir8QkC4coFD+zEQEZSIRcjwjTFZkr0=
|
|
||||||
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18/go.mod h1:KEbMsKoznsebyGHwLk5LqkFOxL5uXSRdvpP4+avmAMs=
|
|
||||||
github.com/leaanthony/winicon v1.0.0 h1:ZNt5U5dY71oEoKZ97UVwJRT4e+5xo5o/ieKuHuk8NqQ=
|
github.com/leaanthony/winicon v1.0.0 h1:ZNt5U5dY71oEoKZ97UVwJRT4e+5xo5o/ieKuHuk8NqQ=
|
||||||
github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU=
|
github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU=
|
||||||
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
|
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
|
||||||
@@ -159,6 +160,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
|
||||||
|
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
||||||
github.com/savsgio/gotils v0.0.0-20200117113501-90175b0fbe3f h1:PgA+Olipyj258EIEYnpFFONrrCcAIWNUNoFhUfMqAGY=
|
github.com/savsgio/gotils v0.0.0-20200117113501-90175b0fbe3f h1:PgA+Olipyj258EIEYnpFFONrrCcAIWNUNoFhUfMqAGY=
|
||||||
github.com/savsgio/gotils v0.0.0-20200117113501-90175b0fbe3f/go.mod h1:lHhJedqxCoHN+zMtwGNTXWmF0u9Jt363FYRhV6g0CdY=
|
github.com/savsgio/gotils v0.0.0-20200117113501-90175b0fbe3f/go.mod h1:lHhJedqxCoHN+zMtwGNTXWmF0u9Jt363FYRhV6g0CdY=
|
||||||
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
|
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
|
||||||
@@ -208,8 +211,6 @@ github.com/wzshiming/winseq v0.0.0-20200112104235-db357dc107ae h1:tpXvBXC3hpQBDC
|
|||||||
github.com/wzshiming/winseq v0.0.0-20200112104235-db357dc107ae/go.mod h1:VTAq37rkGeV+WOybvZwjXiJOicICdpLCN8ifpISjK20=
|
github.com/wzshiming/winseq v0.0.0-20200112104235-db357dc107ae/go.mod h1:VTAq37rkGeV+WOybvZwjXiJOicICdpLCN8ifpISjK20=
|
||||||
github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI=
|
github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI=
|
||||||
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
|
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
|
||||||
github.com/xyproto/xpm v1.2.1 h1:trdvGjjWBsOOKzBBUPT6JvaIQM3acJEEYfbxN7M96wg=
|
|
||||||
github.com/xyproto/xpm v1.2.1/go.mod h1:cMnesLsD0PBXLgjDfTDEaKr8XyTFsnP1QycSqRw7BiY=
|
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/ztrue/tracerr v0.3.0 h1:lDi6EgEYhPYPnKcjsYzmWw4EkFEoA/gfe+I9Y5f+h6Y=
|
github.com/ztrue/tracerr v0.3.0 h1:lDi6EgEYhPYPnKcjsYzmWw4EkFEoA/gfe+I9Y5f+h6Y=
|
||||||
github.com/ztrue/tracerr v0.3.0/go.mod h1:qEalzze4VN9O8tnhBXScfCrmoJo10o8TN5ciKjm6Mww=
|
github.com/ztrue/tracerr v0.3.0/go.mod h1:qEalzze4VN9O8tnhBXScfCrmoJo10o8TN5ciKjm6Mww=
|
||||||
@@ -247,18 +248,17 @@ golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210218145245-beda7e5e158e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210611083646-a4fc73990273/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211020174200-9d6173849985 h1:LOlKVhfDyahgmqa97awczplwkjzNaELFg3zRIJ13RYo=
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
|
||||||
golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -280,10 +280,12 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
|
|||||||
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
|
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
|
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
|
||||||
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
//go:build !windows
|
||||||
// +build !windows
|
// +build !windows
|
||||||
|
|
||||||
package wails
|
package wails
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
//go:build !desktop && !hybrid && !server && !dev
|
||||||
// +build !desktop,!hybrid,!server,!dev
|
// +build !desktop,!hybrid,!server,!dev
|
||||||
|
|
||||||
package app
|
package app
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
//go:build !server && !desktop && hybrid
|
||||||
// +build !server,!desktop,hybrid
|
// +build !server,!desktop,hybrid
|
||||||
|
|
||||||
package app
|
package app
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
//+build !windows
|
//go:build !windows
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
package app
|
package app
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
//+build windows
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
package app
|
package app
|
||||||
|
|
||||||
|
|||||||
@@ -61,6 +61,9 @@ func generateBindings(bindings *binding.Bindings) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if projectConfig.WailsJSDir == "" {
|
||||||
|
projectConfig.WailsJSDir = filepath.Join(cwd, "frontend")
|
||||||
|
}
|
||||||
wrapperDir := filepath.Join(projectConfig.WailsJSDir, "wailsjs", "runtime")
|
wrapperDir := filepath.Join(projectConfig.WailsJSDir, "wailsjs", "runtime")
|
||||||
_ = os.RemoveAll(wrapperDir)
|
_ = os.RemoveAll(wrapperDir)
|
||||||
extractor := gosod.New(wrapper.RuntimeWrapper)
|
extractor := gosod.New(wrapper.RuntimeWrapper)
|
||||||
@@ -100,6 +103,12 @@ func generateBindings(bindings *binding.Bindings) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bindingsTypes := filepath.Join(targetDir, "bindings.d.ts")
|
||||||
|
err = bindings.GenerateBackendTS(bindingsTypes)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
32
v2/internal/appng/app_default_linux.go
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
//go:build !dev && !production && !bindings && linux
|
||||||
|
|
||||||
|
package appng
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/options"
|
||||||
|
)
|
||||||
|
|
||||||
|
// App defines a Wails application structure
|
||||||
|
type App struct{}
|
||||||
|
|
||||||
|
func (a *App) Run() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateApp creates the app!
|
||||||
|
func CreateApp(_ *options.App) (*App, error) {
|
||||||
|
// result := w32.MessageBox(0,
|
||||||
|
// `Wails applications will not build without the correct build tags.
|
||||||
|
//Please use "wails build" or press "OK" to open the documentation on how to use "go build"`,
|
||||||
|
// "Error",
|
||||||
|
// w32.MB_ICONERROR|w32.MB_OKCANCEL)
|
||||||
|
// if result == 1 {
|
||||||
|
// exec.Command("rundll32", "url.dll,FileProtocolHandler", "https://wails.io").Start()
|
||||||
|
// }
|
||||||
|
|
||||||
|
err := fmt.Errorf(`Wails applications will not build without the correct build tags.`)
|
||||||
|
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
@@ -5,7 +5,13 @@ package appng
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"embed"
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
iofs "io/fs"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/wailsapp/wails/v2/internal/binding"
|
"github.com/wailsapp/wails/v2/internal/binding"
|
||||||
"github.com/wailsapp/wails/v2/internal/frontend"
|
"github.com/wailsapp/wails/v2/internal/frontend"
|
||||||
"github.com/wailsapp/wails/v2/internal/frontend/desktop"
|
"github.com/wailsapp/wails/v2/internal/frontend/desktop"
|
||||||
@@ -16,18 +22,14 @@ import (
|
|||||||
"github.com/wailsapp/wails/v2/internal/logger"
|
"github.com/wailsapp/wails/v2/internal/logger"
|
||||||
"github.com/wailsapp/wails/v2/internal/menumanager"
|
"github.com/wailsapp/wails/v2/internal/menumanager"
|
||||||
"github.com/wailsapp/wails/v2/internal/project"
|
"github.com/wailsapp/wails/v2/internal/project"
|
||||||
"github.com/wailsapp/wails/v2/internal/signal"
|
|
||||||
pkglogger "github.com/wailsapp/wails/v2/pkg/logger"
|
pkglogger "github.com/wailsapp/wails/v2/pkg/logger"
|
||||||
"github.com/wailsapp/wails/v2/pkg/options"
|
"github.com/wailsapp/wails/v2/pkg/options"
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// App defines a Wails application structure
|
// App defines a Wails application structure
|
||||||
type App struct {
|
type App struct {
|
||||||
frontend frontend.Frontend
|
frontend frontend.Frontend
|
||||||
logger *logger.Logger
|
logger *logger.Logger
|
||||||
signal *signal.Manager
|
|
||||||
options *options.App
|
options *options.App
|
||||||
|
|
||||||
menuManager *menumanager.Manager
|
menuManager *menumanager.Manager
|
||||||
@@ -60,19 +62,65 @@ func CreateApp(appoptions *options.App) (*App, error) {
|
|||||||
myLogger.SetLogLevel(appoptions.LogLevel)
|
myLogger.SetLogLevel(appoptions.LogLevel)
|
||||||
|
|
||||||
// Check for CLI Flags
|
// Check for CLI Flags
|
||||||
assetdir := flag.String("assetdir", "", "Directory to serve assets")
|
var assetdirFlag *string
|
||||||
devServerURL := flag.String("devserverurl", "", "URL of development server")
|
var devServerURLFlag *string
|
||||||
loglevel := flag.String("loglevel", "debug", "Loglevel to use - Trace, Debug, Info, Warning, Error")
|
var loglevelFlag *string
|
||||||
flag.Parse()
|
|
||||||
if devServerURL != nil && *devServerURL != "" {
|
assetdir := os.Getenv("assetdir")
|
||||||
ctx = context.WithValue(ctx, "devserverurl", *devServerURL)
|
if assetdir == "" {
|
||||||
|
assetdirFlag = flag.String("assetdir", "", "Directory to serve assets")
|
||||||
}
|
}
|
||||||
if assetdir != nil && *assetdir != "" {
|
devServerURL := os.Getenv("devserverurl")
|
||||||
ctx = context.WithValue(ctx, "assetdir", *assetdir)
|
if devServerURL == "" {
|
||||||
|
devServerURLFlag = flag.String("devserverurl", "", "URL of development server")
|
||||||
}
|
}
|
||||||
|
|
||||||
if loglevel != nil && *loglevel != "" {
|
loglevel := os.Getenv("loglevel")
|
||||||
level, err := pkglogger.StringToLogLevel(*loglevel)
|
if loglevel == "" {
|
||||||
|
loglevelFlag = flag.String("loglevel", "debug", "Loglevel to use - Trace, Debug, Info, Warning, Error")
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we weren't given the assetdir in the environment variables
|
||||||
|
if assetdir == "" {
|
||||||
|
flag.Parse()
|
||||||
|
if assetdirFlag != nil {
|
||||||
|
assetdir = *assetdirFlag
|
||||||
|
}
|
||||||
|
if devServerURLFlag != nil {
|
||||||
|
devServerURL = *devServerURLFlag
|
||||||
|
}
|
||||||
|
if loglevelFlag != nil {
|
||||||
|
loglevel = *loglevelFlag
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if assetdir == "" {
|
||||||
|
// If no assetdir has been defined, let's try to infer it from the project root and the asset FS.
|
||||||
|
assetdir, err = tryInferAssetDirFromFS(appoptions.Assets)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if assetdir != "" {
|
||||||
|
// Let's override the assets to serve from on disk, if needed
|
||||||
|
absdir, err := filepath.Abs(assetdir)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
myLogger.Info("Serving assets from disk: %s", absdir)
|
||||||
|
appoptions.Assets = os.DirFS(absdir)
|
||||||
|
|
||||||
|
ctx = context.WithValue(ctx, "assetdir", assetdir)
|
||||||
|
}
|
||||||
|
|
||||||
|
if devServerURL != "" {
|
||||||
|
ctx = context.WithValue(ctx, "devserverurl", devServerURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if loglevel != "" {
|
||||||
|
level, err := pkglogger.StringToLogLevel(loglevel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -166,6 +214,42 @@ func generateBindings(bindings *binding.Bindings) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bindingsTypes := filepath.Join(targetDir, "bindings.d.ts")
|
||||||
|
err = bindings.GenerateBackendTS(bindingsTypes)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func tryInferAssetDirFromFS(assets iofs.FS) (string, error) {
|
||||||
|
if _, isEmbedFs := assets.(embed.FS); !isEmbedFs {
|
||||||
|
// We only infer the assetdir for embed.FS assets
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
path, err := fs.FindPathToFile(assets, "index.html")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
path, err = filepath.Abs(path)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := os.Stat(filepath.Join(path, "index.html")); err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
err = fmt.Errorf(
|
||||||
|
"inferred assetdir '%s' does not exist or does not contain an 'index.html' file, "+
|
||||||
|
"please specify it with -assetdir or set it in wails.json",
|
||||||
|
path)
|
||||||
|
}
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return path, nil
|
||||||
|
}
|
||||||
|
|||||||
15
v2/internal/appng/app_linux.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
//go:build linux && !bindings
|
||||||
|
|
||||||
|
package appng
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/wailsapp/wails/v2/internal/logger"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/options"
|
||||||
|
)
|
||||||
|
|
||||||
|
func PreflightChecks(options *options.App, logger *logger.Logger) error {
|
||||||
|
|
||||||
|
_ = options
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ package appng
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/wailsapp/wails/v2/internal/binding"
|
"github.com/wailsapp/wails/v2/internal/binding"
|
||||||
"github.com/wailsapp/wails/v2/internal/frontend"
|
"github.com/wailsapp/wails/v2/internal/frontend"
|
||||||
"github.com/wailsapp/wails/v2/internal/frontend/desktop"
|
"github.com/wailsapp/wails/v2/internal/frontend/desktop"
|
||||||
@@ -12,7 +13,6 @@ import (
|
|||||||
"github.com/wailsapp/wails/v2/internal/frontend/runtime"
|
"github.com/wailsapp/wails/v2/internal/frontend/runtime"
|
||||||
"github.com/wailsapp/wails/v2/internal/logger"
|
"github.com/wailsapp/wails/v2/internal/logger"
|
||||||
"github.com/wailsapp/wails/v2/internal/menumanager"
|
"github.com/wailsapp/wails/v2/internal/menumanager"
|
||||||
"github.com/wailsapp/wails/v2/internal/signal"
|
|
||||||
"github.com/wailsapp/wails/v2/pkg/options"
|
"github.com/wailsapp/wails/v2/pkg/options"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -20,7 +20,6 @@ import (
|
|||||||
type App struct {
|
type App struct {
|
||||||
frontend frontend.Frontend
|
frontend frontend.Frontend
|
||||||
logger *logger.Logger
|
logger *logger.Logger
|
||||||
signal *signal.Manager
|
|
||||||
options *options.App
|
options *options.App
|
||||||
|
|
||||||
menuManager *menumanager.Manager
|
menuManager *menumanager.Manager
|
||||||
@@ -82,6 +81,9 @@ func CreateApp(appoptions *options.App) (*App, error) {
|
|||||||
appFrontend := desktop.NewFrontend(ctx, appoptions, myLogger, appBindings, messageDispatcher)
|
appFrontend := desktop.NewFrontend(ctx, appoptions, myLogger, appBindings, messageDispatcher)
|
||||||
eventHandler.AddFrontend(appFrontend)
|
eventHandler.AddFrontend(appFrontend)
|
||||||
|
|
||||||
|
// Attach logger to context
|
||||||
|
ctx = context.WithValue(ctx, "logger", myLogger)
|
||||||
|
|
||||||
result := &App{
|
result := &App{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
frontend: appFrontend,
|
frontend: appFrontend,
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ func PreflightChecks(options *options.App, logger *logger.Logger) error {
|
|||||||
// Process the webview2 runtime situation. We can pass a strategy in via the `webview2` flag for `wails build`.
|
// Process the webview2 runtime situation. We can pass a strategy in via the `webview2` flag for `wails build`.
|
||||||
// This will determine how wv2runtime.Process will handle a lack of valid runtime.
|
// This will determine how wv2runtime.Process will handle a lack of valid runtime.
|
||||||
installedVersion, err := wv2runtime.Process()
|
installedVersion, err := wv2runtime.Process()
|
||||||
if installedVersion != nil {
|
if installedVersion != "" {
|
||||||
logger.Debug("WebView2 Runtime installed: Name: '%s' Version:'%s' Location:'%s'. Minimum version required: %s.",
|
logger.Debug("WebView2 Runtime Version '%s' installed. Minimum version required: %s.",
|
||||||
installedVersion.Name, installedVersion.Version, installedVersion.Location, wv2runtime.MinimumRuntimeVersion)
|
installedVersion, wv2runtime.MinimumRuntimeVersion)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
|
//go:build !desktop
|
||||||
// +build !desktop
|
// +build !desktop
|
||||||
|
|
||||||
package assetdb
|
package assetdb
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -122,6 +122,83 @@ export default go;`)
|
|||||||
return os.WriteFile(targetfile, output.Bytes(), 0755)
|
return os.WriteFile(targetfile, output.Bytes(), 0755)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GenerateBackendTS generates typescript bindings for
|
||||||
|
// the bound methods.
|
||||||
|
func (b *Bindings) GenerateBackendTS(targetfile string) error {
|
||||||
|
|
||||||
|
store := b.db.store
|
||||||
|
var output bytes.Buffer
|
||||||
|
|
||||||
|
output.WriteString("interface go {\n")
|
||||||
|
|
||||||
|
var sortedPackageNames slicer.StringSlicer
|
||||||
|
for packageName := range store {
|
||||||
|
sortedPackageNames.Add(packageName)
|
||||||
|
}
|
||||||
|
sortedPackageNames.Sort()
|
||||||
|
sortedPackageNames.Each(func(packageName string) {
|
||||||
|
packages := store[packageName]
|
||||||
|
output.WriteString(fmt.Sprintf(" \"%s\": {", packageName))
|
||||||
|
output.WriteString("\n")
|
||||||
|
var sortedStructNames slicer.StringSlicer
|
||||||
|
for structName := range packages {
|
||||||
|
sortedStructNames.Add(structName)
|
||||||
|
}
|
||||||
|
sortedStructNames.Sort()
|
||||||
|
|
||||||
|
sortedStructNames.Each(func(structName string) {
|
||||||
|
structs := packages[structName]
|
||||||
|
output.WriteString(fmt.Sprintf(" \"%s\": {", structName))
|
||||||
|
output.WriteString("\n")
|
||||||
|
|
||||||
|
var sortedMethodNames slicer.StringSlicer
|
||||||
|
for methodName := range structs {
|
||||||
|
sortedMethodNames.Add(methodName)
|
||||||
|
}
|
||||||
|
sortedMethodNames.Sort()
|
||||||
|
|
||||||
|
sortedMethodNames.Each(func(methodName string) {
|
||||||
|
methodDetails := structs[methodName]
|
||||||
|
output.WriteString(fmt.Sprintf("\t\t%s(", methodName))
|
||||||
|
|
||||||
|
var args slicer.StringSlicer
|
||||||
|
for count, input := range methodDetails.Inputs {
|
||||||
|
arg := fmt.Sprintf("arg%d", count+1)
|
||||||
|
args.Add(arg + ":" + goTypeToTypescriptType(input.TypeName))
|
||||||
|
}
|
||||||
|
output.WriteString(args.Join(",") + "):")
|
||||||
|
returnType := "Promise"
|
||||||
|
if methodDetails.OutputCount() > 0 {
|
||||||
|
firstType := goTypeToTypescriptType(methodDetails.Outputs[0].TypeName)
|
||||||
|
returnType += "<" + firstType
|
||||||
|
if methodDetails.OutputCount() == 2 {
|
||||||
|
secondType := goTypeToTypescriptType(methodDetails.Outputs[1].TypeName)
|
||||||
|
returnType += "|" + secondType
|
||||||
|
}
|
||||||
|
returnType += ">"
|
||||||
|
} else {
|
||||||
|
returnType = "Promise<void>"
|
||||||
|
}
|
||||||
|
output.WriteString(returnType + "\n")
|
||||||
|
})
|
||||||
|
|
||||||
|
output.WriteString(" },\n")
|
||||||
|
})
|
||||||
|
output.WriteString(" }\n\n")
|
||||||
|
})
|
||||||
|
output.WriteString("}\n")
|
||||||
|
|
||||||
|
globals := `
|
||||||
|
declare global {
|
||||||
|
interface Window {
|
||||||
|
go: go;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
output.WriteString(globals)
|
||||||
|
return os.WriteFile(targetfile, output.Bytes(), 0755)
|
||||||
|
}
|
||||||
|
|
||||||
func goTypeToJSDocType(input string) string {
|
func goTypeToJSDocType(input string) string {
|
||||||
switch true {
|
switch true {
|
||||||
case input == "string":
|
case input == "string":
|
||||||
@@ -139,7 +216,7 @@ func goTypeToJSDocType(input string) string {
|
|||||||
return "string"
|
return "string"
|
||||||
case strings.HasPrefix(input, "[]"):
|
case strings.HasPrefix(input, "[]"):
|
||||||
arrayType := goTypeToJSDocType(input[2:])
|
arrayType := goTypeToJSDocType(input[2:])
|
||||||
return "Array.<" + arrayType + ">"
|
return "Array<" + arrayType + ">"
|
||||||
default:
|
default:
|
||||||
if strings.ContainsRune(input, '.') {
|
if strings.ContainsRune(input, '.') {
|
||||||
return strings.Split(input, ".")[1]
|
return strings.Split(input, ".")[1]
|
||||||
@@ -147,3 +224,11 @@ func goTypeToJSDocType(input string) string {
|
|||||||
return "any"
|
return "any"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func goTypeToTypescriptType(input string) string {
|
||||||
|
if strings.HasPrefix(input, "[]") {
|
||||||
|
arrayType := goTypeToJSDocType(input[2:])
|
||||||
|
return "Array<" + arrayType + ">"
|
||||||
|
}
|
||||||
|
return goTypeToJSDocType(input)
|
||||||
|
}
|
||||||
|
|||||||
@@ -78,10 +78,16 @@ func (b *Bindings) getMethods(value interface{}) ([]*BoundMethod, error) {
|
|||||||
input := methodType.In(inputIndex)
|
input := methodType.In(inputIndex)
|
||||||
thisParam := newParameter("", input)
|
thisParam := newParameter("", input)
|
||||||
|
|
||||||
|
thisInput := input
|
||||||
|
|
||||||
|
if thisInput.Kind() == reflect.Slice {
|
||||||
|
thisInput = thisInput.Elem()
|
||||||
|
}
|
||||||
|
|
||||||
// Process struct pointer params
|
// Process struct pointer params
|
||||||
if input.Kind() == reflect.Ptr {
|
if thisInput.Kind() == reflect.Ptr {
|
||||||
if input.Elem().Kind() == reflect.Struct {
|
if thisInput.Elem().Kind() == reflect.Struct {
|
||||||
typ := input.Elem()
|
typ := thisInput.Elem()
|
||||||
a := reflect.New(typ)
|
a := reflect.New(typ)
|
||||||
s := reflect.Indirect(a).Interface()
|
s := reflect.Indirect(a).Interface()
|
||||||
b.converter.Add(s)
|
b.converter.Add(s)
|
||||||
@@ -89,8 +95,8 @@ func (b *Bindings) getMethods(value interface{}) ([]*BoundMethod, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Process struct params
|
// Process struct params
|
||||||
if input.Kind() == reflect.Struct {
|
if thisInput.Kind() == reflect.Struct {
|
||||||
a := reflect.New(input)
|
a := reflect.New(thisInput)
|
||||||
s := reflect.Indirect(a).Interface()
|
s := reflect.Indirect(a).Interface()
|
||||||
b.converter.Add(s)
|
b.converter.Add(s)
|
||||||
}
|
}
|
||||||
@@ -108,6 +114,30 @@ func (b *Bindings) getMethods(value interface{}) ([]*BoundMethod, error) {
|
|||||||
for outputIndex := 0; outputIndex < outputParamCount; outputIndex++ {
|
for outputIndex := 0; outputIndex < outputParamCount; outputIndex++ {
|
||||||
output := methodType.Out(outputIndex)
|
output := methodType.Out(outputIndex)
|
||||||
thisParam := newParameter("", output)
|
thisParam := newParameter("", output)
|
||||||
|
|
||||||
|
thisOutput := output
|
||||||
|
|
||||||
|
if thisOutput.Kind() == reflect.Slice {
|
||||||
|
thisOutput = thisOutput.Elem()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process struct pointer params
|
||||||
|
if thisOutput.Kind() == reflect.Ptr {
|
||||||
|
if thisOutput.Elem().Kind() == reflect.Struct {
|
||||||
|
typ := thisOutput.Elem()
|
||||||
|
a := reflect.New(typ)
|
||||||
|
s := reflect.Indirect(a).Interface()
|
||||||
|
b.converter.Add(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process struct params
|
||||||
|
if thisOutput.Kind() == reflect.Struct {
|
||||||
|
a := reflect.New(thisOutput)
|
||||||
|
s := reflect.Indirect(a).Interface()
|
||||||
|
b.converter.Add(s)
|
||||||
|
}
|
||||||
|
|
||||||
outputs = append(outputs, thisParam)
|
outputs = append(outputs, thisParam)
|
||||||
}
|
}
|
||||||
boundMethod.Outputs = outputs
|
boundMethod.Outputs = outputs
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
//go:build !windows
|
||||||
// +build !windows
|
// +build !windows
|
||||||
|
|
||||||
package ffenestri
|
package ffenestri
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
//go:build windows
|
||||||
// +build windows
|
// +build windows
|
||||||
|
|
||||||
package ffenestri
|
package ffenestri
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
|
//go:build wv2runtime.browser
|
||||||
// +build wv2runtime.browser
|
// +build wv2runtime.browser
|
||||||
|
|
||||||
package wv2runtime
|
package wv2runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/leaanthony/webview2runtime"
|
"github.com/wailsapp/wails/v2/internal/webview2runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func doInstallationStrategy(installStatus installationStatus) error {
|
func doInstallationStrategy(installStatus installationStatus) error {
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
// +build !wv2runtime.error
|
//go:build !wv2runtime.error && !wv2runtime.browser && !wv2runtime.embed
|
||||||
// +build !wv2runtime.browser
|
// +build !wv2runtime.error,!wv2runtime.browser,!wv2runtime.embed
|
||||||
// +build !wv2runtime.embed
|
|
||||||
|
|
||||||
package wv2runtime
|
package wv2runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/leaanthony/webview2runtime"
|
"github.com/wailsapp/wails/v2/internal/webview2runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func doInstallationStrategy(installStatus installationStatus) error {
|
func doInstallationStrategy(installStatus installationStatus) error {
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
|
//go:build wv2runtime.embed
|
||||||
// +build wv2runtime.embed
|
// +build wv2runtime.embed
|
||||||
|
|
||||||
package wv2runtime
|
package wv2runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/leaanthony/webview2runtime"
|
"github.com/wailsapp/wails/v2/internal/webview2runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func doInstallationStrategy(installStatus installationStatus) error {
|
func doInstallationStrategy(installStatus installationStatus) error {
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
|
//go:build wv2runtime.error
|
||||||
// +build wv2runtime.error
|
// +build wv2runtime.error
|
||||||
|
|
||||||
package wv2runtime
|
package wv2runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/leaanthony/webview2runtime"
|
"github.com/wailsapp/wails/v2/internal/webview2runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func doInstallationStrategy(installStatus installationStatus) error {
|
func doInstallationStrategy(installStatus installationStatus) error {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package wv2runtime
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leaanthony/go-webview2/webviewloader"
|
"github.com/leaanthony/go-webview2/webviewloader"
|
||||||
"github.com/leaanthony/webview2runtime"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const MinimumRuntimeVersion string = "91.0.992.28"
|
const MinimumRuntimeVersion string = "91.0.992.28"
|
||||||
@@ -15,14 +14,17 @@ const (
|
|||||||
installed
|
installed
|
||||||
)
|
)
|
||||||
|
|
||||||
func Process() (*webview2runtime.Info, error) {
|
func Process() (string, error) {
|
||||||
installStatus := needsInstalling
|
installStatus := needsInstalling
|
||||||
installedVersion := webview2runtime.GetInstalledVersion()
|
installedVersion, err := webviewloader.GetInstalledVersion()
|
||||||
if installedVersion != nil {
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if installedVersion != "" {
|
||||||
installStatus = installed
|
installStatus = installed
|
||||||
compareResult, err := webviewloader.CompareBrowserVersions(installedVersion.Version, MinimumRuntimeVersion)
|
compareResult, err := webviewloader.CompareBrowserVersions(installedVersion, MinimumRuntimeVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return "", err
|
||||||
}
|
}
|
||||||
updateRequired := compareResult == -1
|
updateRequired := compareResult == -1
|
||||||
// Installed and does not require updating
|
// Installed and does not require updating
|
||||||
|
|||||||
@@ -1,14 +1,16 @@
|
|||||||
//+build windows
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
package ffenestri
|
package ffenestri
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/leaanthony/slicer"
|
|
||||||
"github.com/wailsapp/wails/v2/internal/menumanager"
|
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
"text/tabwriter"
|
"text/tabwriter"
|
||||||
|
|
||||||
|
"github.com/leaanthony/slicer"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/menumanager"
|
||||||
)
|
)
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------
|
/* ---------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
//+build windows,debug
|
//go:build windows && debug
|
||||||
|
// +build windows,debug
|
||||||
|
|
||||||
package ffenestri
|
package ffenestri
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
//go:build windows && !debug
|
||||||
// +build windows,!debug
|
// +build windows,!debug
|
||||||
|
|
||||||
package ffenestri
|
package ffenestri
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
//+build windows
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
package ffenestri
|
package ffenestri
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
//+build windows
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
package ffenestri
|
package ffenestri
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
//+build windows
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
package ffenestri
|
package ffenestri
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
//+build windows
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
package ffenestri
|
package ffenestri
|
||||||
|
|
||||||
|
|||||||
@@ -5,11 +5,13 @@ package assetserver
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"github.com/wailsapp/wails/v2/internal/frontend/runtime"
|
"context"
|
||||||
"github.com/wailsapp/wails/v2/pkg/options"
|
"io/fs"
|
||||||
"golang.org/x/net/html"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/internal/frontend/runtime"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/logger"
|
||||||
|
"golang.org/x/net/html"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -19,35 +21,41 @@ It injects a websocket based IPC script into `index.html`.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
type BrowserAssetServer struct {
|
type BrowserAssetServer struct {
|
||||||
runtimeJS []byte
|
assets fs.FS
|
||||||
assetdir string
|
runtimeJS []byte
|
||||||
appOptions *options.App
|
logger *logger.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewBrowserAssetServer(assetdir string, bindingsJSON string, appOptions *options.App) (*BrowserAssetServer, error) {
|
func NewBrowserAssetServer(ctx context.Context, assets fs.FS, bindingsJSON string) (*BrowserAssetServer, error) {
|
||||||
result := &BrowserAssetServer{
|
result := &BrowserAssetServer{}
|
||||||
assetdir: assetdir,
|
_logger := ctx.Value("logger")
|
||||||
appOptions: appOptions,
|
if _logger != nil {
|
||||||
|
result.logger = _logger.(*logger.Logger)
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
result.assets, err = prepareAssetsForServing(assets)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
buffer.WriteString(`window.wailsbindings='` + bindingsJSON + `';` + "\n")
|
buffer.WriteString(`window.wailsbindings='` + bindingsJSON + `';` + "\n")
|
||||||
buffer.Write(runtime.RuntimeDesktopJS)
|
buffer.Write(runtime.RuntimeDesktopJS)
|
||||||
result.runtimeJS = buffer.Bytes()
|
result.runtimeJS = buffer.Bytes()
|
||||||
|
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *BrowserAssetServer) loadFileFromDisk(filename string) ([]byte, error) {
|
func (d *BrowserAssetServer) LogDebug(message string, args ...interface{}) {
|
||||||
return os.ReadFile(filepath.Join(a.assetdir, filename))
|
if d.logger != nil {
|
||||||
|
d.logger.Debug("[BrowserAssetServer] "+message, args...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *BrowserAssetServer) processIndexHTML() ([]byte, error) {
|
func (a *BrowserAssetServer) processIndexHTML() ([]byte, error) {
|
||||||
indexHTML, err := a.loadFileFromDisk("index.html")
|
indexHTML, err := fs.ReadFile(a.assets, "index.html")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -97,15 +105,9 @@ func (a *BrowserAssetServer) Load(filename string) ([]byte, string, error) {
|
|||||||
case "/wails/ipc.js":
|
case "/wails/ipc.js":
|
||||||
content = runtime.WebsocketIPC
|
content = runtime.WebsocketIPC
|
||||||
default:
|
default:
|
||||||
content, err = a.loadFileFromDisk(filename)
|
filename = strings.TrimPrefix(filename, "/")
|
||||||
if strings.HasSuffix(filename, ".js") {
|
a.LogDebug("Loading file: %s", filename)
|
||||||
var buffer bytes.Buffer
|
content, err = fs.ReadFile(a.assets, filename)
|
||||||
buffer.WriteString("window.awaitIPC('" + filename + "', ()=>{")
|
|
||||||
buffer.Write(content)
|
|
||||||
buffer.WriteString(`
|
|
||||||
});`)
|
|
||||||
content = buffer.Bytes()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", err
|
return nil, "", err
|
||||||
|
|||||||
25
v2/internal/frontend/assetserver/assetserver_common.go
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package assetserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
iofs "io/fs"
|
||||||
|
"path"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/internal/fs"
|
||||||
|
)
|
||||||
|
|
||||||
|
func prepareAssetsForServing(assets iofs.FS) (iofs.FS, error) {
|
||||||
|
if _, err := assets.Open("."); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
subDir, err := fs.FindPathToFile(assets, "index.html")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
assets, err = iofs.Sub(assets, path.Clean(subDir))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return assets, nil
|
||||||
|
}
|
||||||
@@ -3,26 +3,21 @@ package assetserver
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"embed"
|
|
||||||
"fmt"
|
|
||||||
"github.com/leaanthony/debme"
|
|
||||||
"github.com/leaanthony/slicer"
|
|
||||||
"github.com/wailsapp/wails/v2/internal/frontend/runtime"
|
|
||||||
"github.com/wailsapp/wails/v2/internal/logger"
|
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"log"
|
"log"
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/internal/frontend/runtime"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
type DesktopAssetServer struct {
|
type DesktopAssetServer struct {
|
||||||
assets debme.Debme
|
assets fs.FS
|
||||||
runtimeJS []byte
|
runtimeJS []byte
|
||||||
assetdir string
|
|
||||||
logger *logger.Logger
|
logger *logger.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDesktopAssetServer(ctx context.Context, assets embed.FS, bindingsJSON string) (*DesktopAssetServer, error) {
|
func NewDesktopAssetServer(ctx context.Context, assets fs.FS, bindingsJSON string) (*DesktopAssetServer, error) {
|
||||||
result := &DesktopAssetServer{}
|
result := &DesktopAssetServer{}
|
||||||
|
|
||||||
_logger := ctx.Value("logger")
|
_logger := ctx.Value("logger")
|
||||||
@@ -30,22 +25,18 @@ func NewDesktopAssetServer(ctx context.Context, assets embed.FS, bindingsJSON st
|
|||||||
result.logger = _logger.(*logger.Logger)
|
result.logger = _logger.(*logger.Logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
_assetdir := ctx.Value("assetdir")
|
var err error
|
||||||
if _assetdir != nil {
|
result.assets, err = prepareAssetsForServing(assets)
|
||||||
result.assetdir = _assetdir.(string)
|
if err != nil {
|
||||||
absdir, err := filepath.Abs(result.assetdir)
|
return nil, err
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
result.LogDebug("Loading assets from: %s", absdir)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
buffer.WriteString(`window.wailsbindings='` + bindingsJSON + `';` + "\n")
|
buffer.WriteString(`window.wailsbindings='` + bindingsJSON + `';` + "\n")
|
||||||
buffer.Write(runtime.RuntimeDesktopJS)
|
buffer.Write(runtime.RuntimeDesktopJS)
|
||||||
result.runtimeJS = buffer.Bytes()
|
result.runtimeJS = buffer.Bytes()
|
||||||
err := result.init(assets)
|
|
||||||
return result, err
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DesktopAssetServer) LogDebug(message string, args ...interface{}) {
|
func (d *DesktopAssetServer) LogDebug(message string, args ...interface{}) {
|
||||||
@@ -54,63 +45,8 @@ func (d *DesktopAssetServer) LogDebug(message string, args ...interface{}) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DesktopAssetServer) SetAssetDir(assetdir string) {
|
|
||||||
d.assetdir = assetdir
|
|
||||||
}
|
|
||||||
|
|
||||||
func PathToIndexHTML(assets embed.FS) (string, error) {
|
|
||||||
stat, err := fs.Stat(assets, "index.html")
|
|
||||||
if stat != nil {
|
|
||||||
return ".", nil
|
|
||||||
}
|
|
||||||
var indexFiles slicer.StringSlicer
|
|
||||||
err = fs.WalkDir(assets, ".", func(path string, d fs.DirEntry, err error) error {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if strings.HasSuffix(path, "index.html") {
|
|
||||||
indexFiles.Add(path)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
if indexFiles.Length() > 1 {
|
|
||||||
return "", fmt.Errorf("multiple 'index.html' files found in assets")
|
|
||||||
}
|
|
||||||
|
|
||||||
path, _ := filepath.Split(indexFiles.AsSlice()[0])
|
|
||||||
return path, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func processAssets(assets embed.FS) (debme.Debme, error) {
|
|
||||||
|
|
||||||
result, err := debme.FS(assets, ".")
|
|
||||||
if err != nil {
|
|
||||||
return result, err
|
|
||||||
}
|
|
||||||
// Find index.html
|
|
||||||
path, err := PathToIndexHTML(assets)
|
|
||||||
if err != nil {
|
|
||||||
return debme.Debme{}, err
|
|
||||||
}
|
|
||||||
return debme.FS(assets, path)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *DesktopAssetServer) init(assets embed.FS) error {
|
|
||||||
|
|
||||||
var err error
|
|
||||||
a.assets, err = processAssets(assets)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *DesktopAssetServer) processIndexHTML() ([]byte, error) {
|
func (a *DesktopAssetServer) processIndexHTML() ([]byte, error) {
|
||||||
indexHTML, err := a.ReadFile("index.html")
|
indexHTML, err := fs.ReadFile(a.assets, "index.html")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -146,7 +82,9 @@ func (a *DesktopAssetServer) Load(filename string) ([]byte, string, error) {
|
|||||||
case "/wails/ipc.js":
|
case "/wails/ipc.js":
|
||||||
content = runtime.DesktopIPC
|
content = runtime.DesktopIPC
|
||||||
default:
|
default:
|
||||||
content, err = a.ReadFile(filename)
|
filename = strings.TrimPrefix(filename, "/")
|
||||||
|
a.LogDebug("Loading file: %s", filename)
|
||||||
|
content, err = fs.ReadFile(a.assets, filename)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", err
|
return nil, "", err
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
//go:build dev
|
|
||||||
|
|
||||||
package assetserver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (a *DesktopAssetServer) ReadFile(filename string) ([]byte, error) {
|
|
||||||
a.LogDebug("Loading file from disk: %s", filename)
|
|
||||||
return os.ReadFile(filepath.Join(a.assetdir, filename))
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
//go:build production
|
|
||||||
|
|
||||||
package assetserver
|
|
||||||
|
|
||||||
func (a *DesktopAssetServer) ReadFile(filename string) ([]byte, error) {
|
|
||||||
return a.assets.ReadFile(filename)
|
|
||||||
}
|
|
||||||
20
v2/internal/frontend/desktop/common/uri_translate.go
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import "net/url"
|
||||||
|
|
||||||
|
func TranslateUriToFile(uri string, expectedScheme string, expectedHost string) (file string, match bool, err error) {
|
||||||
|
url, err := url.Parse(uri)
|
||||||
|
if err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if url.Scheme != expectedScheme || url.Host != expectedHost {
|
||||||
|
return "", false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
filePath := url.Path
|
||||||
|
if filePath == "" {
|
||||||
|
filePath = "/"
|
||||||
|
}
|
||||||
|
return filePath, true, nil
|
||||||
|
}
|
||||||
@@ -9,11 +9,14 @@
|
|||||||
#define AppDelegate_h
|
#define AppDelegate_h
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#import "WailsContext.h"
|
||||||
|
|
||||||
@interface AppDelegate : NSResponder <NSTouchBarProvider>
|
@interface AppDelegate : NSResponder <NSTouchBarProvider>
|
||||||
|
|
||||||
@property bool alwaysOnTop;
|
@property bool alwaysOnTop;
|
||||||
@property (retain) NSWindow* mainWindow;
|
@property bool startHidden;
|
||||||
|
@property bool startFullscreen;
|
||||||
|
@property (retain) WailsWindow* mainWindow;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|||||||
@@ -16,37 +16,27 @@
|
|||||||
}
|
}
|
||||||
- (void)applicationWillFinishLaunching:(NSNotification *)aNotification {
|
- (void)applicationWillFinishLaunching:(NSNotification *)aNotification {
|
||||||
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
||||||
[self.mainWindow makeKeyAndOrderFront:self];
|
|
||||||
if (self.alwaysOnTop) {
|
if (self.alwaysOnTop) {
|
||||||
[self.mainWindow setLevel:NSStatusWindowLevel];
|
[self.mainWindow setLevel:NSStatusWindowLevel];
|
||||||
}
|
}
|
||||||
|
if ( !self.startHidden ) {
|
||||||
|
[self.mainWindow makeKeyAndOrderFront:self];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
||||||
[NSApp activateIgnoringOtherApps:YES];
|
[NSApp activateIgnoringOtherApps:YES];
|
||||||
|
if ( self.startFullscreen ) {
|
||||||
|
NSWindowCollectionBehavior behaviour = [self.mainWindow collectionBehavior];
|
||||||
|
behaviour |= NSWindowCollectionBehaviorFullScreenPrimary;
|
||||||
|
[self.mainWindow setCollectionBehavior:behaviour];
|
||||||
|
[self.mainWindow toggleFullScreen:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)dealloc {
|
||||||
|
[super dealloc];
|
||||||
}
|
}
|
||||||
//
|
|
||||||
//- (void) CreateMenu {
|
|
||||||
// [NSApplication sharedApplication];
|
|
||||||
// menubar = [[NSMenu new] autorelease];
|
|
||||||
// id appMenuItem = [[NSMenuItem new] autorelease];
|
|
||||||
// [menubar addItem:appMenuItem];
|
|
||||||
// [NSApp setMainMenu:menubar];
|
|
||||||
// id appMenu = [[NSMenu new] autorelease];
|
|
||||||
// id appName = [[NSProcessInfo processInfo] processName];
|
|
||||||
// id quitTitle = [@"Quit " stringByAppendingString:appName];
|
|
||||||
// id quitMenuItem = [[[NSMenuItem alloc] initWithTitle:quitTitle
|
|
||||||
// action:@selector(terminate:) keyEquivalent:@"q"]
|
|
||||||
// autorelease];
|
|
||||||
// [appMenu addItem:quitMenuItem];
|
|
||||||
// [appMenuItem setSubmenu:appMenu];
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//- (void) dealloc {
|
|
||||||
// [super dealloc];
|
|
||||||
// window = nil;
|
|
||||||
// menubar = nil;
|
|
||||||
//}
|
|
||||||
|
|
||||||
@synthesize touchBar;
|
@synthesize touchBar;
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,12 @@
|
|||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "WailsContext.h"
|
#import "WailsContext.h"
|
||||||
|
|
||||||
WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int debug);
|
#define WindowStartsNormal 0
|
||||||
|
#define WindowStartsMaximised 1
|
||||||
|
#define WindowStartsMinimised 2
|
||||||
|
#define WindowStartsFullscreen 3
|
||||||
|
|
||||||
|
WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int debug, int windowStartState, int startsHidden, int minWidth, int minHeight, int maxWidth, int maxHeight);
|
||||||
void Run(void*);
|
void Run(void*);
|
||||||
|
|
||||||
void SetTitle(void* ctx, const char *title);
|
void SetTitle(void* ctx, const char *title);
|
||||||
@@ -36,9 +41,26 @@ void Quit(void*);
|
|||||||
const char* GetSize(void *ctx);
|
const char* GetSize(void *ctx);
|
||||||
const char* GetPos(void *ctx);
|
const char* GetPos(void *ctx);
|
||||||
|
|
||||||
void ProcessURLResponse(void *inctx, const char *url, const char *contentType, const char *data, int datalength);
|
void ProcessURLResponse(void *inctx, const char *url, int statusCode, const char *contentType, void* data, int datalength);
|
||||||
|
|
||||||
void MessageDialog(void *inctx, const char* dialogType, const char* title, const char* message, const char* button1, const char* button2, const char* button3, const char* button4, const char* defaultButton, const char* cancelButton);
|
/* Dialogs */
|
||||||
|
|
||||||
|
void MessageDialog(void *inctx, const char* dialogType, const char* title, const char* message, const char* button1, const char* button2, const char* button3, const char* button4, const char* defaultButton, const char* cancelButton, void* iconData, int iconDataLength);
|
||||||
void OpenFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int allowDirectories, int allowFiles, int canCreateDirectories, int treatPackagesAsDirectories, int resolveAliases, int showHiddenFiles, int allowMultipleSelection, const char* filters);
|
void OpenFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int allowDirectories, int allowFiles, int canCreateDirectories, int treatPackagesAsDirectories, int resolveAliases, int showHiddenFiles, int allowMultipleSelection, const char* filters);
|
||||||
void SaveFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int canCreateDirectories, int treatPackagesAsDirectories, int showHiddenFiles, const char* filters);
|
void SaveFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int canCreateDirectories, int treatPackagesAsDirectories, int showHiddenFiles, const char* filters);
|
||||||
|
|
||||||
|
/* Application Menu */
|
||||||
|
void* NewMenu(const char* name);
|
||||||
|
void AppendSubmenu(void* parent, void* child);
|
||||||
|
void AppendRole(void *inctx, void *inMenu, int role);
|
||||||
|
void SetAsApplicationMenu(void *inctx, void *inMenu);
|
||||||
|
void UpdateApplicationMenu(void *inctx);
|
||||||
|
|
||||||
|
void SetAbout(void *inctx, const char* title, const char* description, void* imagedata, int datalen);
|
||||||
|
void* AppendMenuItem(void* inctx, void* nsmenu, const char* label, const char* shortcutKey, int modifiers, int disabled, int checked, int menuItemID);
|
||||||
|
void AppendSeparator(void* inMenu);
|
||||||
|
void UpdateMenuItem(void* nsmenuitem, int checked);
|
||||||
|
|
||||||
|
NSString* safeInit(const char* input);
|
||||||
|
|
||||||
#endif /* Application_h */
|
#endif /* Application_h */
|
||||||
|
|||||||
@@ -9,43 +9,72 @@
|
|||||||
#import "WailsContext.h"
|
#import "WailsContext.h"
|
||||||
#import "Application.h"
|
#import "Application.h"
|
||||||
#import "AppDelegate.h"
|
#import "AppDelegate.h"
|
||||||
|
#import "WailsMenu.h"
|
||||||
|
#import "WailsMenuItem.h"
|
||||||
|
|
||||||
WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int debug) {
|
WailsContext* Create(const char* title, int width, int height, int frameless, int resizable, int fullscreen, int fullSizeContent, int hideTitleBar, int titlebarAppearsTransparent, int hideTitle, int useToolbar, int hideToolbarSeparator, int webviewIsTransparent, int alwaysOnTop, int hideWindowOnClose, const char *appearance, int windowIsTranslucent, int debug, int windowStartState, int startsHidden, int minWidth, int minHeight, int maxWidth, int maxHeight) {
|
||||||
|
|
||||||
|
[NSApplication sharedApplication];
|
||||||
|
|
||||||
WailsContext *result = [WailsContext new];
|
WailsContext *result = [WailsContext new];
|
||||||
|
|
||||||
result.debug = debug;
|
result.debug = debug;
|
||||||
|
|
||||||
[result CreateWindow:width :height :frameless :resizable :fullscreen :fullSizeContent :hideTitleBar :titlebarAppearsTransparent :hideTitle :useToolbar :hideToolbarSeparator :webviewIsTransparent :hideWindowOnClose :appearance :windowIsTranslucent];
|
if ( windowStartState == WindowStartsFullscreen ) {
|
||||||
[result SetTitle:title];
|
fullscreen = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
[result CreateWindow:width :height :frameless :resizable :fullscreen :fullSizeContent :hideTitleBar :titlebarAppearsTransparent :hideTitle :useToolbar :hideToolbarSeparator :webviewIsTransparent :hideWindowOnClose :safeInit(appearance) :windowIsTranslucent :minWidth :minHeight :maxWidth :maxHeight];
|
||||||
|
[result SetTitle:safeInit(title)];
|
||||||
[result Center];
|
[result Center];
|
||||||
|
|
||||||
|
switch( windowStartState ) {
|
||||||
|
case WindowStartsMaximised:
|
||||||
|
[result.mainWindow zoom:nil];
|
||||||
|
break;
|
||||||
|
case WindowStartsMinimised:
|
||||||
|
//TODO: Can you start a mac app minimised?
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( startsHidden == 1 ) {
|
||||||
|
result.startHidden = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( fullscreen == 1 ) {
|
||||||
|
result.startFullscreen = true;
|
||||||
|
}
|
||||||
|
|
||||||
result.alwaysOnTop = alwaysOnTop;
|
result.alwaysOnTop = alwaysOnTop;
|
||||||
result.hideOnClose = hideWindowOnClose;
|
result.hideOnClose = hideWindowOnClose;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProcessURLResponse(void *inctx, const char *url, const char *contentType, const char* data, int datalength) {
|
void ProcessURLResponse(void *inctx, const char *url, int statusCode, const char *contentType, void* data, int datalength) {
|
||||||
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
NSString *nsurl = [[NSString alloc] initWithUTF8String:url];
|
NSString *nsurl = safeInit(url);
|
||||||
NSString *nsContentType = [[NSString alloc] initWithUTF8String:contentType];
|
NSString *nsContentType = safeInit(contentType);
|
||||||
NSData *nsdata = [NSData dataWithBytes:data length:datalength];
|
NSData *nsdata = [NSData dataWithBytes:data length:datalength];
|
||||||
|
|
||||||
[ctx processURLResponse:nsurl :nsContentType :nsdata];
|
[ctx processURLResponse:nsurl :statusCode :nsContentType :nsdata];
|
||||||
|
|
||||||
|
[nsdata release];
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExecJS(void* inctx, const char *script) {
|
void ExecJS(void* inctx, const char *script) {
|
||||||
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
|
NSString *nsscript = safeInit(script);
|
||||||
ON_MAIN_THREAD(
|
ON_MAIN_THREAD(
|
||||||
[ctx ExecJS:script];
|
[ctx ExecJS:nsscript];
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetTitle(void* inctx, const char *title) {
|
void SetTitle(void* inctx, const char *title) {
|
||||||
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
|
NSString *_title = safeInit(title);
|
||||||
ON_MAIN_THREAD(
|
ON_MAIN_THREAD(
|
||||||
[ctx SetTitle:title];
|
[ctx SetTitle:_title];
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,7 +110,7 @@ void SetMaxSize(void* inctx, int width, int height) {
|
|||||||
void SetPosition(void* inctx, int x, int y) {
|
void SetPosition(void* inctx, int x, int y) {
|
||||||
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
ON_MAIN_THREAD(
|
ON_MAIN_THREAD(
|
||||||
[ctx SetSize:x :y];
|
[ctx SetPosition:x :y];
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,42 +202,138 @@ void Show(void *inctx) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageDialog(void *inctx, const char* dialogType, const char* title, const char* message, const char* button1, const char* button2, const char* button3, const char* button4, const char* defaultButton, const char* cancelButton) {
|
NSString* safeInit(const char* input) {
|
||||||
|
NSString *result = nil;
|
||||||
|
if (input != nil) {
|
||||||
|
result = [NSString stringWithUTF8String:input];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessageDialog(void *inctx, const char* dialogType, const char* title, const char* message, const char* button1, const char* button2, const char* button3, const char* button4, const char* defaultButton, const char* cancelButton, void* iconData, int iconDataLength) {
|
||||||
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
|
|
||||||
|
NSString *_dialogType = safeInit(dialogType);
|
||||||
|
NSString *_title = safeInit(title);
|
||||||
|
NSString *_message = safeInit(message);
|
||||||
|
NSString *_button1 = safeInit(button1);
|
||||||
|
NSString *_button2 = safeInit(button2);
|
||||||
|
NSString *_button3 = safeInit(button3);
|
||||||
|
NSString *_button4 = safeInit(button4);
|
||||||
|
NSString *_defaultButton = safeInit(defaultButton);
|
||||||
|
NSString *_cancelButton = safeInit(cancelButton);
|
||||||
|
|
||||||
ON_MAIN_THREAD(
|
ON_MAIN_THREAD(
|
||||||
[ctx MessageDialog:dialogType :title :message :button1 :button2 :button3 :button4 :defaultButton :cancelButton];
|
[ctx MessageDialog:_dialogType :_title :_message :_button1 :_button2 :_button3 :_button4 :_defaultButton :_cancelButton :iconData :iconDataLength];
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int allowDirectories, int allowFiles, int canCreateDirectories, int treatPackagesAsDirectories, int resolveAliases, int showHiddenFiles, int allowMultipleSelection, const char* filters) {
|
void OpenFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int allowDirectories, int allowFiles, int canCreateDirectories, int treatPackagesAsDirectories, int resolveAliases, int showHiddenFiles, int allowMultipleSelection, const char* filters) {
|
||||||
|
|
||||||
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
|
NSString *_title = safeInit(title);
|
||||||
|
NSString *_defaultFilename = safeInit(defaultFilename);
|
||||||
|
NSString *_defaultDirectory = safeInit(defaultDirectory);
|
||||||
|
NSString *_filters = safeInit(filters);
|
||||||
|
|
||||||
ON_MAIN_THREAD(
|
ON_MAIN_THREAD(
|
||||||
[ctx OpenFileDialog:title :defaultFilename :defaultDirectory :allowDirectories :allowFiles :canCreateDirectories :treatPackagesAsDirectories :resolveAliases :showHiddenFiles :allowMultipleSelection :filters];
|
[ctx OpenFileDialog:_title :_defaultFilename :_defaultDirectory :allowDirectories :allowFiles :canCreateDirectories :treatPackagesAsDirectories :resolveAliases :showHiddenFiles :allowMultipleSelection :_filters];
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
void SaveFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int canCreateDirectories, int treatPackagesAsDirectories, int showHiddenFiles, const char* filters) {
|
void SaveFileDialog(void *inctx, const char* title, const char* defaultFilename, const char* defaultDirectory, int canCreateDirectories, int treatPackagesAsDirectories, int showHiddenFiles, const char* filters) {
|
||||||
|
|
||||||
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
|
NSString *_title = safeInit(title);
|
||||||
|
NSString *_defaultFilename = safeInit(defaultFilename);
|
||||||
|
NSString *_defaultDirectory = safeInit(defaultDirectory);
|
||||||
|
NSString *_filters = safeInit(filters);
|
||||||
|
|
||||||
ON_MAIN_THREAD(
|
ON_MAIN_THREAD(
|
||||||
[ctx SaveFileDialog:title :defaultFilename :defaultDirectory :canCreateDirectories :treatPackagesAsDirectories :showHiddenFiles :filters];
|
[ctx SaveFileDialog:_title :_defaultFilename :_defaultDirectory :canCreateDirectories :treatPackagesAsDirectories :showHiddenFiles :_filters];
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AppendRole(void *inctx, void *inMenu, int role) {
|
||||||
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
|
WailsMenu *menu = (__bridge WailsMenu*) inMenu;
|
||||||
|
[menu appendRole :ctx :role];
|
||||||
|
}
|
||||||
|
|
||||||
|
void* NewMenu(const char *name) {
|
||||||
|
NSString *title = @"";
|
||||||
|
if (name != nil) {
|
||||||
|
title = [NSString stringWithUTF8String:name];
|
||||||
|
}
|
||||||
|
WailsMenu *result = [[WailsMenu new] initWithNSTitle:title];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppendSubmenu(void* inparent, void* inchild) {
|
||||||
|
WailsMenu *parent = (__bridge WailsMenu*) inparent;
|
||||||
|
WailsMenu *child = (__bridge WailsMenu*) inchild;
|
||||||
|
[parent appendSubmenu:child];
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetAsApplicationMenu(void *inctx, void *inMenu) {
|
||||||
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
|
WailsMenu *menu = (__bridge WailsMenu*) inMenu;
|
||||||
|
ctx.applicationMenu = menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateApplicationMenu(void *inctx) {
|
||||||
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
|
ON_MAIN_THREAD(
|
||||||
|
NSApplication *app = [NSApplication sharedApplication];
|
||||||
|
[app setMainMenu:ctx.applicationMenu];
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetAbout(void *inctx, const char* title, const char* description, void* imagedata, int datalen) {
|
||||||
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
|
NSString *_title = safeInit(title);
|
||||||
|
NSString *_description = safeInit(description);
|
||||||
|
|
||||||
|
[ctx SetAbout :_title :_description :imagedata :datalen];
|
||||||
|
}
|
||||||
|
|
||||||
|
void* AppendMenuItem(void* inctx, void* inMenu, const char* label, const char* shortcutKey, int modifiers, int disabled, int checked, int menuItemID) {
|
||||||
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
|
WailsMenu *menu = (__bridge WailsMenu*) inMenu;
|
||||||
|
NSString *_label = safeInit(label);
|
||||||
|
NSString *_shortcutKey = safeInit(shortcutKey);
|
||||||
|
|
||||||
|
return [menu AppendMenuItem:ctx :_label :_shortcutKey :modifiers :disabled :checked :menuItemID];
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateMenuItem(void* nsmenuitem, int checked) {
|
||||||
|
ON_MAIN_THREAD(
|
||||||
|
WailsMenuItem *menuItem = (__bridge WailsMenuItem*) nsmenuitem;
|
||||||
|
[menuItem setState:(checked == 1?NSControlStateValueOn:NSControlStateValueOff)];
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AppendSeparator(void* inMenu) {
|
||||||
|
WailsMenu *menu = (__bridge WailsMenu*) inMenu;
|
||||||
|
[menu AppendSeparator];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Run(void *inctx) {
|
void Run(void *inctx) {
|
||||||
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
WailsContext *ctx = (__bridge WailsContext*) inctx;
|
||||||
[NSApplication sharedApplication];
|
NSApplication *app = [NSApplication sharedApplication];
|
||||||
AppDelegate* delegate = [AppDelegate new];
|
AppDelegate* delegate = [AppDelegate new];
|
||||||
[NSApp setDelegate:(id)delegate];
|
[app setDelegate:(id)delegate];
|
||||||
ctx.appdelegate = delegate;
|
ctx.appdelegate = delegate;
|
||||||
delegate.mainWindow = ctx.mainWindow;
|
delegate.mainWindow = ctx.mainWindow;
|
||||||
delegate.alwaysOnTop = ctx.alwaysOnTop;
|
delegate.alwaysOnTop = ctx.alwaysOnTop;
|
||||||
|
delegate.startHidden = ctx.startHidden;
|
||||||
|
delegate.startFullscreen = ctx.startFullscreen;
|
||||||
|
|
||||||
[ctx loadRequest:@"wails://wails/"];
|
[ctx loadRequest:@"wails://wails/"];
|
||||||
|
[app setMainMenu:ctx.applicationMenu];
|
||||||
[NSApp run];
|
[app run];
|
||||||
[ctx release];
|
[ctx release];
|
||||||
NSLog(@"Here");
|
|
||||||
}
|
}
|
||||||
|
|||||||
16
v2/internal/frontend/desktop/darwin/Role.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
//
|
||||||
|
// Role.h
|
||||||
|
// test
|
||||||
|
//
|
||||||
|
// Created by Lea Anthony on 24/10/21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef Role_h
|
||||||
|
#define Role_h
|
||||||
|
|
||||||
|
typedef int Role;
|
||||||
|
|
||||||
|
static const Role AppMenu = 1;
|
||||||
|
static const Role EditMenu = 2;
|
||||||
|
|
||||||
|
#endif /* Role_h */
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
@interface WailsAlert : NSAlert
|
@interface WailsAlert : NSAlert
|
||||||
- (void)addButton:(const char*)text :(const char*)defaultButton :(const char*)cancelButton;
|
- (void)addButton:(NSString*)text :(NSString*)defaultButton :(NSString*)cancelButton;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,14 +11,14 @@
|
|||||||
|
|
||||||
@implementation WailsAlert
|
@implementation WailsAlert
|
||||||
|
|
||||||
- (void)addButton:(const char*)text :(const char*)defaultButton :(const char*)cancelButton {
|
- (void)addButton:(NSString*)text :(NSString*)defaultButton :(NSString*)cancelButton {
|
||||||
if( text == nil ) {
|
if( text == nil ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
NSButton *button = [self addButtonWithTitle:[NSString stringWithUTF8String:text]];
|
NSButton *button = [self addButtonWithTitle:text];
|
||||||
if( defaultButton != nil && strcmp(text, defaultButton) == 0) {
|
if( defaultButton != nil && [text isEqualToString:defaultButton]) {
|
||||||
[button setKeyEquivalent:@"\r"];
|
[button setKeyEquivalent:@"\r"];
|
||||||
} else if( cancelButton != nil && strcmp(text, cancelButton) == 0) {
|
} else if( cancelButton != nil && [text isEqualToString:cancelButton]) {
|
||||||
[button setKeyEquivalent:@"\033"];
|
[button setKeyEquivalent:@"\033"];
|
||||||
} else {
|
} else {
|
||||||
[button setKeyEquivalent:@""];
|
[button setKeyEquivalent:@""];
|
||||||
|
|||||||
@@ -11,13 +11,25 @@
|
|||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import <WebKit/WebKit.h>
|
#import <WebKit/WebKit.h>
|
||||||
|
|
||||||
|
#if __has_include(<UniformTypeIdentifiers/UTType.h>)
|
||||||
|
#define USE_NEW_FILTERS
|
||||||
|
#import <UniformTypeIdentifiers/UTType.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ON_MAIN_THREAD(str) dispatch_async(dispatch_get_main_queue(), ^{ str; });
|
#define ON_MAIN_THREAD(str) dispatch_async(dispatch_get_main_queue(), ^{ str; });
|
||||||
|
#define unicode(input) [NSString stringWithFormat:@"%C", input]
|
||||||
|
|
||||||
@interface WailsWindow : NSWindow
|
@interface WailsWindow : NSWindow
|
||||||
- (BOOL)canBecomeKeyWindow;
|
|
||||||
|
@property NSSize userMinSize;
|
||||||
|
@property NSSize userMaxSize;
|
||||||
|
|
||||||
|
- (BOOL) canBecomeKeyWindow;
|
||||||
|
- (void) applyWindowConstraints;
|
||||||
|
- (void) disableWindowConstraints;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface WailsContext : NSObject <WKURLSchemeHandler,WKScriptMessageHandler>
|
@interface WailsContext : NSObject <WKURLSchemeHandler,WKScriptMessageHandler,WKNavigationDelegate>
|
||||||
|
|
||||||
@property (retain) WailsWindow* mainWindow;
|
@property (retain) WailsWindow* mainWindow;
|
||||||
@property (retain) WKWebView* webview;
|
@property (retain) WKWebView* webview;
|
||||||
@@ -25,27 +37,30 @@
|
|||||||
|
|
||||||
@property bool hideOnClose;
|
@property bool hideOnClose;
|
||||||
@property bool shuttingDown;
|
@property bool shuttingDown;
|
||||||
|
@property bool startHidden;
|
||||||
@property NSSize maxSize;
|
@property bool startFullscreen;
|
||||||
@property NSSize minSize;
|
|
||||||
|
|
||||||
@property (retain) NSEvent* mouseEvent;
|
@property (retain) NSEvent* mouseEvent;
|
||||||
|
|
||||||
@property bool alwaysOnTop;
|
@property bool alwaysOnTop;
|
||||||
@property bool maximised;
|
|
||||||
|
|
||||||
@property bool debug;
|
@property bool debug;
|
||||||
|
|
||||||
@property (retain) WKUserContentController* userContentController;
|
@property (retain) WKUserContentController* userContentController;
|
||||||
|
|
||||||
@property (retain) NSMutableDictionary *urlRequests;
|
@property (retain) NSMutableDictionary *urlRequests;
|
||||||
|
|
||||||
- (void) CreateWindow:(int)width :(int)height :(bool)frameless :(bool)resizable :(bool)fullscreen :(bool)fullSizeContent :(bool)hideTitleBar :(bool)titlebarAppearsTransparent :(bool)hideTitle :(bool)useToolbar :(bool)hideToolbarSeparator :(bool)webviewIsTransparent :(bool)hideWindowOnClose :(const char *)appearance :(bool)windowIsTranslucent;
|
@property (retain) NSMenu* applicationMenu;
|
||||||
|
|
||||||
|
@property (retain) NSImage* aboutImage;
|
||||||
|
@property (retain) NSString* aboutTitle;
|
||||||
|
@property (retain) NSString* aboutDescription;
|
||||||
|
|
||||||
|
- (void) CreateWindow:(int)width :(int)height :(bool)frameless :(bool)resizable :(bool)fullscreen :(bool)fullSizeContent :(bool)hideTitleBar :(bool)titlebarAppearsTransparent :(bool)hideTitle :(bool)useToolbar :(bool)hideToolbarSeparator :(bool)webviewIsTransparent :(bool)hideWindowOnClose :(NSString *)appearance :(bool)windowIsTranslucent :(int)minWidth :(int)minHeight :(int)maxWidth :(int)maxHeight;
|
||||||
- (void) SetSize:(int)width :(int)height;
|
- (void) SetSize:(int)width :(int)height;
|
||||||
- (void) SetPosition:(int)x :(int) y;
|
- (void) SetPosition:(int)x :(int) y;
|
||||||
- (void) SetMinSize:(int)minWidth :(int)minHeight;
|
- (void) SetMinSize:(int)minWidth :(int)minHeight;
|
||||||
- (void) SetMaxSize:(int)maxWidth :(int)maxHeight;
|
- (void) SetMaxSize:(int)maxWidth :(int)maxHeight;
|
||||||
- (void) SetTitle:(const char*)title;
|
- (void) SetTitle:(NSString*)title;
|
||||||
- (void) Center;
|
- (void) Center;
|
||||||
- (void) Fullscreen;
|
- (void) Fullscreen;
|
||||||
- (void) UnFullscreen;
|
- (void) UnFullscreen;
|
||||||
@@ -58,16 +73,20 @@
|
|||||||
- (void) ShowMouse;
|
- (void) ShowMouse;
|
||||||
- (void) Hide;
|
- (void) Hide;
|
||||||
- (void) Show;
|
- (void) Show;
|
||||||
|
- (void) Quit;
|
||||||
|
|
||||||
-(void) MessageDialog :(const char*)dialogType :(const char*)title :(const char*)message :(const char*)button1 :(const char*)button2 :(const char*)button3 :(const char*)button4 :(const char*)defaultButton :(const char*)cancelButton;
|
-(void) MessageDialog :(NSString*)dialogType :(NSString*)title :(NSString*)message :(NSString*)button1 :(NSString*)button2 :(NSString*)button3 :(NSString*)button4 :(NSString*)defaultButton :(NSString*)cancelButton :(void*)iconData :(int)iconDataLength;
|
||||||
-(void) OpenFileDialog :(const char*)title :(const char*)defaultFilename :(const char*)defaultDirectory :(bool)allowDirectories :(bool)allowFiles :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)resolveAliases :(bool)showHiddenFiles :(bool)allowMultipleSelection :(const char*)filters;
|
- (void) OpenFileDialog :(NSString*)title :(NSString*)defaultFilename :(NSString*)defaultDirectory :(bool)allowDirectories :(bool)allowFiles :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)resolveAliases :(bool)showHiddenFiles :(bool)allowMultipleSelection :(NSString*)filters;
|
||||||
-(void) SaveFileDialog :(const char*)title :(const char*)defaultFilename :(const char*)defaultDirectory :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)showHiddenFiles :(const char*)filters;
|
- (void) SaveFileDialog :(NSString*)title :(NSString*)defaultFilename :(NSString*)defaultDirectory :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)showHiddenFiles :(NSString*)filters;
|
||||||
|
|
||||||
- (void) loadRequest:(NSString*)url;
|
- (void) loadRequest:(NSString*)url;
|
||||||
- (void) processURLResponse:(NSString *)url :(NSString *)contentType :(NSData*)data;
|
- (void) processURLResponse:(NSString *)url :(int)statusCode :(NSString *)contentType :(NSData*)data;
|
||||||
- (void) ExecJS:(const char*)script;
|
- (void) ExecJS:(NSString*)script;
|
||||||
- (NSScreen*) getCurrentScreen;
|
- (NSScreen*) getCurrentScreen;
|
||||||
|
|
||||||
|
- (void) SetAbout :(NSString*)title :(NSString*)description :(void*)imagedata :(int)datalen;
|
||||||
|
- (void) dealloc;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,10 @@
|
|||||||
#import <WebKit/WebKit.h>
|
#import <WebKit/WebKit.h>
|
||||||
#import "WailsContext.h"
|
#import "WailsContext.h"
|
||||||
#import "WailsAlert.h"
|
#import "WailsAlert.h"
|
||||||
|
#import "WailsMenu.h"
|
||||||
#import "WindowDelegate.h"
|
#import "WindowDelegate.h"
|
||||||
#import "message.h"
|
#import "message.h"
|
||||||
|
#import "Role.h"
|
||||||
|
|
||||||
@implementation WailsWindow
|
@implementation WailsWindow
|
||||||
|
|
||||||
@@ -19,6 +21,16 @@
|
|||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) applyWindowConstraints {
|
||||||
|
[self setMinSize:self.userMinSize];
|
||||||
|
[self setMaxSize:self.userMaxSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) disableWindowConstraints {
|
||||||
|
[self setMinSize:NSMakeSize(0, 0)];
|
||||||
|
[self setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation WailsContext
|
@implementation WailsContext
|
||||||
@@ -40,9 +52,9 @@
|
|||||||
|
|
||||||
NSScreen* screen = [self getCurrentScreen];
|
NSScreen* screen = [self getCurrentScreen];
|
||||||
NSRect windowFrame = [self.mainWindow frame];
|
NSRect windowFrame = [self.mainWindow frame];
|
||||||
NSRect screenFrame = [screen visibleFrame];
|
NSRect screenFrame = [screen frame];
|
||||||
windowFrame.origin.x += screenFrame.origin.x + (float)x;
|
windowFrame.origin.x = screenFrame.origin.x + (float)x;
|
||||||
windowFrame.origin.y += (screenFrame.origin.y + screenFrame.size.height) - windowFrame.size.height - (float)y;
|
windowFrame.origin.y = (screenFrame.origin.y + screenFrame.size.height) - windowFrame.size.height - (float)y;
|
||||||
|
|
||||||
[self.mainWindow setFrame:windowFrame display:TRUE animate:FALSE];
|
[self.mainWindow setFrame:windowFrame display:TRUE animate:FALSE];
|
||||||
}
|
}
|
||||||
@@ -52,11 +64,8 @@
|
|||||||
if (self.shuttingDown) return;
|
if (self.shuttingDown) return;
|
||||||
|
|
||||||
NSSize size = { minWidth, minHeight };
|
NSSize size = { minWidth, minHeight };
|
||||||
|
self.mainWindow.userMinSize = size;
|
||||||
self.minSize = size;
|
|
||||||
|
|
||||||
[self.mainWindow setMinSize:size];
|
[self.mainWindow setMinSize:size];
|
||||||
|
|
||||||
[self adjustWindowSize];
|
[self adjustWindowSize];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,10 +79,8 @@
|
|||||||
size.width = maxWidth > 0 ? maxWidth : FLT_MAX;
|
size.width = maxWidth > 0 ? maxWidth : FLT_MAX;
|
||||||
size.height = maxHeight > 0 ? maxHeight : FLT_MAX;
|
size.height = maxHeight > 0 ? maxHeight : FLT_MAX;
|
||||||
|
|
||||||
self.maxSize = size;
|
self.mainWindow.userMaxSize = size;
|
||||||
|
[self.mainWindow setMaxSize:size];
|
||||||
[self.mainWindow setMinSize:size];
|
|
||||||
|
|
||||||
[self adjustWindowSize];
|
[self adjustWindowSize];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,22 +91,23 @@
|
|||||||
|
|
||||||
NSRect currentFrame = [self.mainWindow frame];
|
NSRect currentFrame = [self.mainWindow frame];
|
||||||
|
|
||||||
if ( currentFrame.size.width > self.maxSize.width ) currentFrame.size.width = self.maxSize.width;
|
if ( currentFrame.size.width > self.mainWindow.userMaxSize.width ) currentFrame.size.width = self.mainWindow.userMaxSize.width;
|
||||||
if ( currentFrame.size.width < self.minSize.width ) currentFrame.size.width = self.minSize.width;
|
if ( currentFrame.size.width < self.mainWindow.userMinSize.width ) currentFrame.size.width = self.mainWindow.userMinSize.width;
|
||||||
if ( currentFrame.size.height > self.maxSize.height ) currentFrame.size.height = self.maxSize.height;
|
if ( currentFrame.size.height > self.mainWindow.userMaxSize.height ) currentFrame.size.height = self.mainWindow.userMaxSize.height;
|
||||||
if ( currentFrame.size.height < self.minSize.height ) currentFrame.size.height = self.minSize.height;
|
if ( currentFrame.size.height < self.mainWindow.userMinSize.height ) currentFrame.size.height = self.mainWindow.userMinSize.height;
|
||||||
|
|
||||||
[self.mainWindow setFrame:currentFrame display:TRUE animate:FALSE];
|
[self.mainWindow setFrame:currentFrame display:YES animate:FALSE];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) dealloc {
|
- (void) dealloc {
|
||||||
[super dealloc];
|
|
||||||
[self.appdelegate release];
|
[self.appdelegate release];
|
||||||
[self.mainWindow release];
|
[self.mainWindow release];
|
||||||
[self.mouseEvent release];
|
[self.mouseEvent release];
|
||||||
[self.userContentController release];
|
[self.userContentController release];
|
||||||
[self.urlRequests release];
|
[self.urlRequests release];
|
||||||
|
[self.applicationMenu release];
|
||||||
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSScreen*) getCurrentScreen {
|
- (NSScreen*) getCurrentScreen {
|
||||||
@@ -110,55 +118,58 @@
|
|||||||
return screen;
|
return screen;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) SetTitle:(const char *)title {
|
- (void) SetTitle:(NSString*)title {
|
||||||
NSString *_title = [NSString stringWithUTF8String:title];
|
[self.mainWindow setTitle:title];
|
||||||
[self.mainWindow setTitle:_title];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) Center {
|
- (void) Center {
|
||||||
[self.mainWindow center];
|
[self.mainWindow center];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) CreateWindow:(int)width :(int)height :(bool)frameless :(bool)resizable :(bool)fullscreen :(bool)fullSizeContent :(bool)hideTitleBar :(bool)titlebarAppearsTransparent :(bool)hideTitle :(bool)useToolbar :(bool)hideToolbarSeparator :(bool)webviewIsTransparent :(bool)hideWindowOnClose :(const char *)appearance :(bool)windowIsTranslucent {
|
- (BOOL) isFullscreen {
|
||||||
|
NSWindowStyleMask masks = [self.mainWindow styleMask];
|
||||||
|
if ( masks & NSWindowStyleMaskFullScreen ) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) CreateWindow:(int)width :(int)height :(bool)frameless :(bool)resizable :(bool)fullscreen :(bool)fullSizeContent :(bool)hideTitleBar :(bool)titlebarAppearsTransparent :(bool)hideTitle :(bool)useToolbar :(bool)hideToolbarSeparator :(bool)webviewIsTransparent :(bool)hideWindowOnClose :(NSString*)appearance :(bool)windowIsTranslucent :(int)minWidth :(int)minHeight :(int)maxWidth :(int)maxHeight {
|
||||||
|
|
||||||
self.urlRequests = [NSMutableDictionary new];
|
self.urlRequests = [NSMutableDictionary new];
|
||||||
|
|
||||||
NSWindowStyleMask styleMask = NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable;
|
NSWindowStyleMask styleMask = 0;
|
||||||
|
|
||||||
if (frameless) {
|
if( !frameless ) {
|
||||||
styleMask = NSWindowStyleMaskBorderless;
|
if (!hideTitleBar) {
|
||||||
} else {
|
styleMask |= NSWindowStyleMaskTitled;
|
||||||
if (resizable) {
|
|
||||||
styleMask |= NSWindowStyleMaskResizable;
|
|
||||||
}
|
}
|
||||||
|
styleMask |= NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable;
|
||||||
}
|
}
|
||||||
if (fullscreen) {
|
|
||||||
styleMask |= NSWindowStyleMaskFullScreen;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( fullSizeContent || frameless || titlebarAppearsTransparent ) {
|
if( fullSizeContent || frameless || titlebarAppearsTransparent ) {
|
||||||
styleMask |= NSWindowStyleMaskFullSizeContentView;
|
styleMask |= NSWindowStyleMaskFullSizeContentView;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.mainWindow = [[[WailsWindow alloc] initWithContentRect:NSMakeRect(0, 0, width, height)
|
if (resizable) {
|
||||||
styleMask:styleMask backing:NSBackingStoreBuffered defer:NO]
|
styleMask |= NSWindowStyleMaskResizable;
|
||||||
autorelease];
|
|
||||||
|
|
||||||
if (frameless) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useToolbar) {
|
self.mainWindow = [[WailsWindow alloc] initWithContentRect:NSMakeRect(0, 0, width, height)
|
||||||
NSLog(@"Using Toolbar");
|
styleMask:styleMask backing:NSBackingStoreBuffered defer:NO];
|
||||||
|
|
||||||
|
if (!frameless && useToolbar) {
|
||||||
id toolbar = [[NSToolbar alloc] initWithIdentifier:@"wails.toolbar"];
|
id toolbar = [[NSToolbar alloc] initWithIdentifier:@"wails.toolbar"];
|
||||||
[toolbar autorelease];
|
[toolbar autorelease];
|
||||||
[toolbar setShowsBaselineSeparator:!hideToolbarSeparator];
|
[toolbar setShowsBaselineSeparator:!hideToolbarSeparator];
|
||||||
[self.mainWindow setToolbar:toolbar];
|
[self.mainWindow setToolbar:toolbar];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[self.mainWindow setTitleVisibility:hideTitle];
|
[self.mainWindow setTitleVisibility:hideTitle];
|
||||||
[self.mainWindow setTitlebarAppearsTransparent:titlebarAppearsTransparent];
|
[self.mainWindow setTitlebarAppearsTransparent:titlebarAppearsTransparent];
|
||||||
[self.mainWindow canBecomeKeyWindow];
|
|
||||||
|
// [self.mainWindow canBecomeKeyWindow];
|
||||||
|
|
||||||
id contentView = [self.mainWindow contentView];
|
id contentView = [self.mainWindow contentView];
|
||||||
if (windowIsTranslucent) {
|
if (windowIsTranslucent) {
|
||||||
@@ -172,20 +183,29 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (appearance != nil) {
|
if (appearance != nil) {
|
||||||
NSString *name = [NSString stringWithUTF8String:appearance];
|
NSAppearance *nsAppearance = [NSAppearance appearanceNamed:appearance];
|
||||||
NSAppearance *nsAppearance = [NSAppearance appearanceNamed:name];
|
|
||||||
[self.mainWindow setAppearance:nsAppearance];
|
[self.mainWindow setAppearance:nsAppearance];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up min/max
|
|
||||||
NSSize maxSize = { FLT_MAX, FLT_MAX };
|
NSSize minSize = { minWidth, minHeight };
|
||||||
self.maxSize = maxSize;
|
NSSize maxSize = { maxWidth, maxHeight };
|
||||||
NSSize minSize = { 0, 0 };
|
if (maxSize.width == 0) {
|
||||||
self.minSize = minSize;
|
maxSize.width = FLT_MAX;
|
||||||
[self adjustWindowSize];
|
}
|
||||||
|
if (maxSize.height == 0) {
|
||||||
|
maxSize.height = FLT_MAX;
|
||||||
|
}
|
||||||
|
self.mainWindow.userMaxSize = maxSize;
|
||||||
|
self.mainWindow.userMinSize = minSize;
|
||||||
|
|
||||||
|
if( !fullscreen ) {
|
||||||
|
[self.mainWindow applyWindowConstraints];
|
||||||
|
}
|
||||||
|
|
||||||
WindowDelegate *windowDelegate = [WindowDelegate new];
|
WindowDelegate *windowDelegate = [WindowDelegate new];
|
||||||
windowDelegate.hideOnClose = hideWindowOnClose;
|
windowDelegate.hideOnClose = hideWindowOnClose;
|
||||||
|
windowDelegate.ctx = self;
|
||||||
[self.mainWindow setDelegate:windowDelegate];
|
[self.mainWindow setDelegate:windowDelegate];
|
||||||
|
|
||||||
// Webview stuff here!
|
// Webview stuff here!
|
||||||
@@ -193,7 +213,7 @@
|
|||||||
config.suppressesIncrementalRendering = true;
|
config.suppressesIncrementalRendering = true;
|
||||||
[config setURLSchemeHandler:self forURLScheme:@"wails"];
|
[config setURLSchemeHandler:self forURLScheme:@"wails"];
|
||||||
|
|
||||||
[config.preferences setValue:[NSNumber numberWithBool:true] forKey:@"developerExtrasEnabled"];
|
// [config.preferences setValue:[NSNumber numberWithBool:true] forKey:@"developerExtrasEnabled"];
|
||||||
|
|
||||||
WKUserContentController* userContentController = [WKUserContentController new];
|
WKUserContentController* userContentController = [WKUserContentController new];
|
||||||
[userContentController addScriptMessageHandler:self name:@"external"];
|
[userContentController addScriptMessageHandler:self name:@"external"];
|
||||||
@@ -223,6 +243,8 @@
|
|||||||
[self.webview setValue:[NSNumber numberWithBool:!webviewIsTransparent] forKey:@"drawsBackground"];
|
[self.webview setValue:[NSNumber numberWithBool:!webviewIsTransparent] forKey:@"drawsBackground"];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[self.webview setNavigationDelegate:self];
|
||||||
|
|
||||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||||
[defaults setBool:FALSE forKey:@"NSAutomaticQuoteSubstitutionEnabled"];
|
[defaults setBool:FALSE forKey:@"NSAutomaticQuoteSubstitutionEnabled"];
|
||||||
|
|
||||||
@@ -244,6 +266,30 @@
|
|||||||
return event;
|
return event;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
self.applicationMenu = [NSMenu new];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSMenuItem*) newMenuItem :(NSString*)title :(SEL)selector :(NSString*)key :(NSEventModifierFlags)flags {
|
||||||
|
NSMenuItem *result = [[[NSMenuItem alloc] initWithTitle:title action:selector keyEquivalent:key] autorelease];
|
||||||
|
if( flags != 0 ) {
|
||||||
|
[result setKeyEquivalentModifierMask:flags];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSMenuItem*) newMenuItem :(NSString*)title :(SEL)selector :(NSString*)key {
|
||||||
|
return [self newMenuItem :title :selector :key :0];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSMenu*) newMenu :(NSString*)title {
|
||||||
|
WailsMenu *result = [[WailsMenu new] initWithTitle:title];
|
||||||
|
[result setAutoenablesItems:NO];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) Quit {
|
||||||
|
processMessage("Q");
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) loadRequest :(NSString*)url {
|
- (void) loadRequest :(NSString*)url {
|
||||||
@@ -253,10 +299,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void) SetRGBA:(int)r :(int)g :(int)b :(int)a {
|
- (void) SetRGBA:(int)r :(int)g :(int)b :(int)a {
|
||||||
float red = r/255;
|
float red = r/255.0;
|
||||||
float green = g/255;
|
float green = g/255.0;
|
||||||
float blue = b/255;
|
float blue = b/255.0;
|
||||||
float alpha = a/255;
|
float alpha = a/255.0;
|
||||||
|
|
||||||
id colour = [NSColor colorWithCalibratedRed:red green:green blue:blue alpha:alpha ];
|
id colour = [NSColor colorWithCalibratedRed:red green:green blue:blue alpha:alpha ];
|
||||||
|
|
||||||
@@ -276,9 +322,15 @@
|
|||||||
return (mask & NSWindowStyleMaskFullScreen) == NSWindowStyleMaskFullScreen;
|
return (mask & NSWindowStyleMaskFullScreen) == NSWindowStyleMaskFullScreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (bool) isMaximised {
|
||||||
|
long mask = [self.mainWindow styleMask];
|
||||||
|
return (mask & NSWindowStyleMaskFullScreen) == NSWindowStyleMaskFullScreen;
|
||||||
|
}
|
||||||
|
|
||||||
// Fullscreen sets the main window to be fullscreen
|
// Fullscreen sets the main window to be fullscreen
|
||||||
- (void) Fullscreen {
|
- (void) Fullscreen {
|
||||||
if( ! [self isFullScreen] ) {
|
if( ! [self isFullScreen] ) {
|
||||||
|
[self.mainWindow disableWindowConstraints];
|
||||||
[self.mainWindow toggleFullScreen:nil];
|
[self.mainWindow toggleFullScreen:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -286,6 +338,7 @@
|
|||||||
// UnFullscreen resets the main window after a fullscreen
|
// UnFullscreen resets the main window after a fullscreen
|
||||||
- (void) UnFullscreen {
|
- (void) UnFullscreen {
|
||||||
if( [self isFullScreen] ) {
|
if( [self isFullScreen] ) {
|
||||||
|
[self.mainWindow applyWindowConstraints];
|
||||||
[self.mainWindow toggleFullScreen:nil];
|
[self.mainWindow toggleFullScreen:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -308,34 +361,35 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void) Maximise {
|
- (void) Maximise {
|
||||||
if (! self.maximised) {
|
if (![self.mainWindow isZoomed]) {
|
||||||
[self.mainWindow zoom:nil];
|
[self.mainWindow zoom:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) UnMaximise {
|
- (void) UnMaximise {
|
||||||
if (self.maximised) {
|
if ([self.mainWindow isZoomed]) {
|
||||||
[self.mainWindow zoom:nil];
|
[self.mainWindow zoom:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) ExecJS:(const char*)script {
|
- (void) ExecJS:(NSString*)script {
|
||||||
NSString *nsscript = [NSString stringWithUTF8String:script];
|
[self.webview evaluateJavaScript:script completionHandler:nil];
|
||||||
[self.webview evaluateJavaScript:nsscript completionHandler:nil];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) processURLResponse:(NSString *)url :(NSString *)contentType :(NSData *)data {
|
- (void) processURLResponse:(NSString *)url :(int)statusCode :(NSString *)contentType :(NSData *)data {
|
||||||
id<WKURLSchemeTask> urlSchemeTask = self.urlRequests[url];
|
id<WKURLSchemeTask> urlSchemeTask = self.urlRequests[url];
|
||||||
NSURL *nsurl = [NSURL URLWithString:url];
|
NSURL *nsurl = [NSURL URLWithString:url];
|
||||||
|
|
||||||
NSHTTPURLResponse *response = [NSHTTPURLResponse new];
|
|
||||||
NSMutableDictionary *headerFields = [NSMutableDictionary new];
|
NSMutableDictionary *headerFields = [NSMutableDictionary new];
|
||||||
headerFields[@"content-type"] = contentType;
|
if ( ![contentType isEqualToString:@""] ) {
|
||||||
[response initWithURL:nsurl statusCode:200 HTTPVersion:@"HTTP/1.1" headerFields:headerFields];
|
headerFields[@"content-type"] = contentType;
|
||||||
|
}
|
||||||
|
NSHTTPURLResponse *response = [[NSHTTPURLResponse new] initWithURL:nsurl statusCode:statusCode HTTPVersion:@"HTTP/1.1" headerFields:headerFields];
|
||||||
[urlSchemeTask didReceiveResponse:response];
|
[urlSchemeTask didReceiveResponse:response];
|
||||||
[urlSchemeTask didReceiveData:data];
|
[urlSchemeTask didReceiveData:data];
|
||||||
[urlSchemeTask didFinish];
|
[urlSchemeTask didFinish];
|
||||||
[self.urlRequests removeObjectForKey:url];
|
[self.urlRequests removeObjectForKey:url];
|
||||||
|
[response release];
|
||||||
|
[headerFields release];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)webView:(nonnull WKWebView *)webView startURLSchemeTask:(nonnull id<WKURLSchemeTask>)urlSchemeTask {
|
- (void)webView:(nonnull WKWebView *)webView startURLSchemeTask:(nonnull id<WKURLSchemeTask>)urlSchemeTask {
|
||||||
@@ -348,20 +402,22 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
|
||||||
|
processMessage("DomReady");
|
||||||
|
}
|
||||||
|
|
||||||
- (void)userContentController:(nonnull WKUserContentController *)userContentController didReceiveScriptMessage:(nonnull WKScriptMessage *)message {
|
- (void)userContentController:(nonnull WKUserContentController *)userContentController didReceiveScriptMessage:(nonnull WKScriptMessage *)message {
|
||||||
NSString *m = message.body;
|
NSString *m = message.body;
|
||||||
|
|
||||||
// Check for drag
|
// Check for drag
|
||||||
if ( [m isEqualToString:@"drag"] ) {
|
if ( [m isEqualToString:@"drag"] ) {
|
||||||
if( ! [self isFullScreen] ) {
|
if( [self isFullScreen] ) {
|
||||||
if( self.mouseEvent != nil ) {
|
|
||||||
[self HideMouse];
|
|
||||||
ON_MAIN_THREAD(
|
|
||||||
[self.mainWindow performWindowDragWithEvent:self.mouseEvent];
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if( self.mouseEvent != nil ) {
|
||||||
|
[self.mainWindow performWindowDragWithEvent:self.mouseEvent];
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *_m = [m UTF8String];
|
const char *_m = [m UTF8String];
|
||||||
@@ -371,25 +427,25 @@
|
|||||||
|
|
||||||
|
|
||||||
/***** Dialogs ******/
|
/***** Dialogs ******/
|
||||||
-(void) MessageDialog :(const char*)dialogType :(const char*)title :(const char*)message :(const char*)button1 :(const char*)button2 :(const char*)button3 :(const char*)button4 :(const char*)defaultButton :(const char*)cancelButton {
|
-(void) MessageDialog :(NSString*)dialogType :(NSString*)title :(NSString*)message :(NSString*)button1 :(NSString*)button2 :(NSString*)button3 :(NSString*)button4 :(NSString*)defaultButton :(NSString*)cancelButton :(void*)iconData :(int)iconDataLength {
|
||||||
|
|
||||||
WailsAlert *alert = [WailsAlert new];
|
WailsAlert *alert = [WailsAlert new];
|
||||||
|
|
||||||
int style = NSAlertStyleInformational;
|
int style = NSAlertStyleInformational;
|
||||||
if (dialogType != nil ) {
|
if (dialogType != nil ) {
|
||||||
if( strcmp(dialogType, "warning") == 0 ) {
|
if( [dialogType isEqualToString:@"warning"] ) {
|
||||||
style = NSAlertStyleWarning;
|
style = NSAlertStyleWarning;
|
||||||
}
|
}
|
||||||
if( strcmp(dialogType, "error") == 0) {
|
if( [dialogType isEqualToString:@"error"] ) {
|
||||||
style = NSAlertStyleCritical;
|
style = NSAlertStyleCritical;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[alert setAlertStyle:style];
|
[alert setAlertStyle:style];
|
||||||
if( strlen(title) > 0 ) {
|
if( title != nil ) {
|
||||||
[alert setMessageText:[NSString stringWithUTF8String:title]];
|
[alert setMessageText:title];
|
||||||
}
|
}
|
||||||
if( strlen(message) > 0 ) {
|
if( message != nil ) {
|
||||||
[alert setInformativeText:[NSString stringWithUTF8String:message]];
|
[alert setInformativeText:message];
|
||||||
}
|
}
|
||||||
|
|
||||||
[alert addButton:button1 :defaultButton :cancelButton];
|
[alert addButton:button1 :defaultButton :cancelButton];
|
||||||
@@ -397,9 +453,19 @@
|
|||||||
[alert addButton:button3 :defaultButton :cancelButton];
|
[alert addButton:button3 :defaultButton :cancelButton];
|
||||||
[alert addButton:button4 :defaultButton :cancelButton];
|
[alert addButton:button4 :defaultButton :cancelButton];
|
||||||
|
|
||||||
|
NSImage *icon = nil;
|
||||||
|
if (iconData != nil) {
|
||||||
|
NSData *imageData = [NSData dataWithBytes:iconData length:iconDataLength];
|
||||||
|
icon = [[NSImage alloc] initWithData:imageData];
|
||||||
|
}
|
||||||
|
if( icon != nil) {
|
||||||
|
[alert setIcon:icon];
|
||||||
|
}
|
||||||
|
[alert.window setLevel:NSFloatingWindowLevel];
|
||||||
|
|
||||||
long response = [alert runModal];
|
long response = [alert runModal];
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
if( response == NSAlertFirstButtonReturn ) {
|
if( response == NSAlertFirstButtonReturn ) {
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
@@ -414,30 +480,43 @@
|
|||||||
processMessageDialogResponse(result);
|
processMessageDialogResponse(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void) OpenFileDialog :(const char*)title :(const char*)defaultFilename :(const char*)defaultDirectory :(bool)allowDirectories :(bool)allowFiles :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)resolveAliases :(bool)showHiddenFiles :(bool)allowMultipleSelection :(const char*)filters {
|
-(void) OpenFileDialog :(NSString*)title :(NSString*)defaultFilename :(NSString*)defaultDirectory :(bool)allowDirectories :(bool)allowFiles :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)resolveAliases :(bool)showHiddenFiles :(bool)allowMultipleSelection :(NSString*)filters {
|
||||||
|
|
||||||
|
|
||||||
// Create the dialog
|
// Create the dialog
|
||||||
NSOpenPanel *dialog = [NSOpenPanel openPanel];
|
NSOpenPanel *dialog = [NSOpenPanel openPanel];
|
||||||
|
|
||||||
// Valid but appears to do nothing.... :/
|
// Valid but appears to do nothing.... :/
|
||||||
if( strlen(title) > 0 ) {
|
if( title != nil ) {
|
||||||
[dialog setTitle:[NSString stringWithUTF8String:title]];
|
[dialog setTitle:title];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filters - semicolon delimited list of file extensions
|
// Filters - semicolon delimited list of file extensions
|
||||||
if( allowFiles ) {
|
if( allowFiles ) {
|
||||||
if( filters != nil && strlen(filters) > 0) {
|
if( filters != nil && [filters length] > 0) {
|
||||||
NSString *filterString = [[NSString stringWithUTF8String:filters] stringByReplacingOccurrencesOfString:@"*." withString:@""];
|
filters = [filters stringByReplacingOccurrencesOfString:@"*." withString:@""];
|
||||||
filterString = [filterString stringByReplacingOccurrencesOfString:@" " withString:@""];
|
filters = [filters stringByReplacingOccurrencesOfString:@" " withString:@""];
|
||||||
NSArray *filterList = [filterString componentsSeparatedByString:@";"];
|
NSArray *filterList = [filters componentsSeparatedByString:@";"];
|
||||||
[dialog setAllowedFileTypes:filterList];
|
#ifdef USE_NEW_FILTERS
|
||||||
|
NSMutableArray *contentTypes = [[NSMutableArray new] autorelease];
|
||||||
|
for (NSString *filter in filterList) {
|
||||||
|
if (@available(macOS 11.0, *)) {
|
||||||
|
UTType *t = [UTType typeWithFilenameExtension:filter];
|
||||||
|
[contentTypes addObject:t];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (@available(macOS 11.0, *)) {
|
||||||
|
[dialog setAllowedContentTypes:contentTypes];
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
[dialog setAllowedFileTypes:filterList];
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
[dialog setAllowsOtherFileTypes:true];
|
[dialog setAllowsOtherFileTypes:true];
|
||||||
}
|
}
|
||||||
// Default Filename
|
// Default Filename
|
||||||
if( defaultFilename != NULL && strlen(defaultFilename) > 0 ) {
|
if( defaultFilename != nil ) {
|
||||||
[dialog setNameFieldStringValue:[NSString stringWithUTF8String:defaultFilename]];
|
[dialog setNameFieldStringValue:defaultFilename];
|
||||||
}
|
}
|
||||||
|
|
||||||
[dialog setAllowsMultipleSelection: allowMultipleSelection];
|
[dialog setAllowsMultipleSelection: allowMultipleSelection];
|
||||||
@@ -446,8 +525,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Default Directory
|
// Default Directory
|
||||||
if( defaultDirectory != NULL && strlen(defaultDirectory) > 0 ) {
|
if( defaultDirectory != nil ) {
|
||||||
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithUTF8String:defaultDirectory]];
|
NSURL *url = [NSURL fileURLWithPath:defaultDirectory];
|
||||||
[dialog setDirectoryURL:url];
|
[dialog setDirectoryURL:url];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -461,6 +540,10 @@
|
|||||||
|
|
||||||
// Setup callback handler
|
// Setup callback handler
|
||||||
[dialog beginSheetModalForWindow:self.mainWindow completionHandler:^(NSModalResponse returnCode) {
|
[dialog beginSheetModalForWindow:self.mainWindow completionHandler:^(NSModalResponse returnCode) {
|
||||||
|
if ( returnCode != NSModalResponseOK) {
|
||||||
|
processOpenFileDialogResponse("[]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
NSMutableArray *arr = [NSMutableArray new];
|
NSMutableArray *arr = [NSMutableArray new];
|
||||||
for (NSURL *url in [dialog URLs]) {
|
for (NSURL *url in [dialog URLs]) {
|
||||||
[arr addObject:[url path]];
|
[arr addObject:[url path]];
|
||||||
@@ -468,42 +551,41 @@
|
|||||||
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:0 error:nil];
|
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:0 error:nil];
|
||||||
NSString *nsjson = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
NSString *nsjson = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
||||||
processOpenFileDialogResponse([nsjson UTF8String]);
|
processOpenFileDialogResponse([nsjson UTF8String]);
|
||||||
|
[nsjson release];
|
||||||
|
[arr release];
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
|
||||||
[dialog runModal];
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
-(void) SaveFileDialog :(const char*)title :(const char*)defaultFilename :(const char*)defaultDirectory :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)showHiddenFiles :(const char*)filters; {
|
-(void) SaveFileDialog :(NSString*)title :(NSString*)defaultFilename :(NSString*)defaultDirectory :(bool)canCreateDirectories :(bool)treatPackagesAsDirectories :(bool)showHiddenFiles :(NSString*)filters; {
|
||||||
|
|
||||||
|
|
||||||
// Create the dialog
|
// Create the dialog
|
||||||
NSSavePanel *dialog = [NSOpenPanel savePanel];
|
NSSavePanel *dialog = [NSSavePanel savePanel];
|
||||||
|
|
||||||
// Valid but appears to do nothing.... :/
|
// Valid but appears to do nothing.... :/
|
||||||
if( strlen(title) > 0 ) {
|
if( title != nil ) {
|
||||||
[dialog setTitle:[NSString stringWithUTF8String:title]];
|
[dialog setTitle:title];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filters - semicolon delimited list of file extensions
|
// Filters - semicolon delimited list of file extensions
|
||||||
if( filters != nil && strlen(filters) > 0) {
|
if( filters != nil && [filters length] > 0) {
|
||||||
NSString *filterString = [[NSString stringWithUTF8String:filters] stringByReplacingOccurrencesOfString:@"*." withString:@""];
|
filters = [filters stringByReplacingOccurrencesOfString:@"*." withString:@""];
|
||||||
filterString = [filterString stringByReplacingOccurrencesOfString:@" " withString:@""];
|
filters = [filters stringByReplacingOccurrencesOfString:@" " withString:@""];
|
||||||
NSArray *filterList = [filterString componentsSeparatedByString:@";"];
|
NSArray *filterList = [filters componentsSeparatedByString:@";"];
|
||||||
[dialog setAllowedFileTypes:filterList];
|
[dialog setAllowedFileTypes:filterList];
|
||||||
} else {
|
} else {
|
||||||
[dialog setAllowsOtherFileTypes:true];
|
[dialog setAllowsOtherFileTypes:true];
|
||||||
}
|
}
|
||||||
// Default Filename
|
// Default Filename
|
||||||
if( defaultFilename != NULL && strlen(defaultFilename) > 0 ) {
|
if( defaultFilename != nil ) {
|
||||||
[dialog setNameFieldStringValue:[NSString stringWithUTF8String:defaultFilename]];
|
[dialog setNameFieldStringValue:defaultFilename];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default Directory
|
// Default Directory
|
||||||
if( defaultDirectory != NULL && strlen(defaultDirectory) > 0 ) {
|
if( defaultDirectory != nil ) {
|
||||||
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithUTF8String:defaultDirectory]];
|
NSURL *url = [NSURL fileURLWithPath:defaultDirectory];
|
||||||
[dialog setDirectoryURL:url];
|
[dialog setDirectoryURL:url];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -514,14 +596,45 @@
|
|||||||
|
|
||||||
// Setup callback handler
|
// Setup callback handler
|
||||||
[dialog beginSheetModalForWindow:self.mainWindow completionHandler:^(NSModalResponse returnCode) {
|
[dialog beginSheetModalForWindow:self.mainWindow completionHandler:^(NSModalResponse returnCode) {
|
||||||
NSURL *url = [dialog URL];
|
if ( returnCode == NSModalResponseOK ) {
|
||||||
processSaveFileDialogResponse([url.path UTF8String]);
|
NSURL *url = [dialog URL];
|
||||||
|
if ( url != nil ) {
|
||||||
|
processSaveFileDialogResponse([url.path UTF8String]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
processSaveFileDialogResponse("");
|
||||||
}];
|
}];
|
||||||
|
|
||||||
[dialog runModal];
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) SetAbout :(NSString*)title :(NSString*)description :(void*)imagedata :(int)datalen {
|
||||||
|
self.aboutTitle = title;
|
||||||
|
self.aboutDescription = description;
|
||||||
|
|
||||||
|
NSData *imageData = [NSData dataWithBytes:imagedata length:datalen];
|
||||||
|
self.aboutImage = [[NSImage alloc] initWithData:imageData];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void) About {
|
||||||
|
|
||||||
|
WailsAlert *alert = [WailsAlert new];
|
||||||
|
[alert setAlertStyle:NSAlertStyleInformational];
|
||||||
|
if( self.aboutTitle != nil ) {
|
||||||
|
[alert setMessageText:self.aboutTitle];
|
||||||
|
}
|
||||||
|
if( self.aboutDescription != nil ) {
|
||||||
|
[alert setInformativeText:self.aboutDescription];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[alert.window setLevel:NSFloatingWindowLevel];
|
||||||
|
if ( self.aboutImage != nil) {
|
||||||
|
[alert setIcon:self.aboutImage];
|
||||||
|
}
|
||||||
|
|
||||||
|
[alert runModal];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|||||||
30
v2/internal/frontend/desktop/darwin/WailsMenu.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
//
|
||||||
|
// WailsMenu.h
|
||||||
|
// test
|
||||||
|
//
|
||||||
|
// Created by Lea Anthony on 25/10/21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef WailsMenu_h
|
||||||
|
#define WailsMenu_h
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#import "Role.h"
|
||||||
|
#import "WailsMenu.h"
|
||||||
|
#import "WailsContext.h"
|
||||||
|
|
||||||
|
@interface WailsMenu : NSMenu
|
||||||
|
|
||||||
|
//- (void) AddMenuByRole :(Role)role;
|
||||||
|
- (WailsMenu*) initWithNSTitle :(NSString*)title;
|
||||||
|
- (void) appendSubmenu :(WailsMenu*)child;
|
||||||
|
- (void) appendRole :(WailsContext*)ctx :(Role)role;
|
||||||
|
|
||||||
|
- (NSMenuItem*) newMenuItemWithContext :(WailsContext*)ctx :(NSString*)title :(SEL)selector :(NSString*)key :(NSEventModifierFlags)flags;
|
||||||
|
- (void*) AppendMenuItem :(WailsContext*)ctx :(NSString*)label :(NSString *)shortcutKey :(int)modifiers :(bool)disabled :(bool)checked :(int)menuItemID;
|
||||||
|
- (void) AppendSeparator;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* WailsMenu_h */
|
||||||
320
v2/internal/frontend/desktop/darwin/WailsMenu.m
Normal file
@@ -0,0 +1,320 @@
|
|||||||
|
//
|
||||||
|
// WailsMenu.m
|
||||||
|
// test
|
||||||
|
//
|
||||||
|
// Created by Lea Anthony on 25/10/21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import "WailsMenu.h"
|
||||||
|
#import "WailsMenuItem.h"
|
||||||
|
#import "Role.h"
|
||||||
|
|
||||||
|
@implementation WailsMenu
|
||||||
|
|
||||||
|
- (NSMenuItem*) newMenuItem :(NSString*)title :(SEL)selector :(NSString*)key :(NSEventModifierFlags)flags {
|
||||||
|
NSMenuItem *result = [[[NSMenuItem alloc] initWithTitle:title action:selector keyEquivalent:key] autorelease];
|
||||||
|
[result setKeyEquivalentModifierMask:flags];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSMenuItem*) newMenuItemWithContext :(WailsContext*)ctx :(NSString*)title :(SEL)selector :(NSString*)key :(NSEventModifierFlags)flags {
|
||||||
|
NSMenuItem *result = [NSMenuItem new];
|
||||||
|
if ( title != nil ) {
|
||||||
|
[result setTitle:title];
|
||||||
|
}
|
||||||
|
if (selector != nil) {
|
||||||
|
[result setAction:selector];
|
||||||
|
}
|
||||||
|
if (key) {
|
||||||
|
[result setKeyEquivalent:key];
|
||||||
|
}
|
||||||
|
if( flags != 0 ) {
|
||||||
|
[result setKeyEquivalentModifierMask:flags];
|
||||||
|
}
|
||||||
|
result.target = ctx;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSMenuItem*) newMenuItem :(NSString*)title :(SEL)selector :(NSString*)key {
|
||||||
|
return [self newMenuItem :title :selector :key :0];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (WailsMenu*) initWithNSTitle:(NSString *)title {
|
||||||
|
if( title != nil ) {
|
||||||
|
[super initWithTitle:title];
|
||||||
|
} else {
|
||||||
|
[self init];
|
||||||
|
}
|
||||||
|
[self setAutoenablesItems:NO];
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) appendSubmenu :(WailsMenu*)child {
|
||||||
|
NSMenuItem *childMenuItem = [[NSMenuItem new] autorelease];
|
||||||
|
[childMenuItem setTitle:child.title];
|
||||||
|
[self addItem:childMenuItem];
|
||||||
|
[childMenuItem setSubmenu:child];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) appendRole :(WailsContext*)ctx :(Role)role {
|
||||||
|
|
||||||
|
switch(role) {
|
||||||
|
case AppMenu:
|
||||||
|
{
|
||||||
|
NSString *appName = [NSRunningApplication currentApplication].localizedName;
|
||||||
|
if( appName == nil ) {
|
||||||
|
appName = [[NSProcessInfo processInfo] processName];
|
||||||
|
}
|
||||||
|
WailsMenu *appMenu = [[[WailsMenu new] initWithNSTitle:appName] autorelease];
|
||||||
|
id quitTitle = [@"Quit " stringByAppendingString:appName];
|
||||||
|
NSMenuItem* quitMenuItem = [self newMenuItem:quitTitle :@selector(Quit) :@"q" :NSEventModifierFlagCommand];
|
||||||
|
quitMenuItem.target = ctx;
|
||||||
|
if (ctx.aboutTitle != nil) {
|
||||||
|
[appMenu addItem:[self newMenuItemWithContext :ctx :[@"About " stringByAppendingString:appName] :@selector(About) :nil :0]];
|
||||||
|
}
|
||||||
|
[appMenu addItem:quitMenuItem];
|
||||||
|
[self appendSubmenu:appMenu];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EditMenu:
|
||||||
|
{
|
||||||
|
WailsMenu *editMenu = [[[WailsMenu new] initWithNSTitle:@"Edit"] autorelease];
|
||||||
|
[editMenu addItem:[self newMenuItem:@"Undo" :@selector(undoActionName) :@"z" :NSEventModifierFlagCommand]];
|
||||||
|
[editMenu addItem:[self newMenuItem:@"Redo" :@selector(redoActionName) :@"z" :(NSEventModifierFlagShift | NSEventModifierFlagCommand)]];
|
||||||
|
[editMenu addItem:[NSMenuItem separatorItem]];
|
||||||
|
[editMenu addItem:[self newMenuItem:@"Cut" :@selector(cut:) :@"x" :NSEventModifierFlagCommand]];
|
||||||
|
[editMenu addItem:[self newMenuItem:@"Copy" :@selector(copy:) :@"c" :NSEventModifierFlagCommand]];
|
||||||
|
[editMenu addItem:[self newMenuItem:@"Paste" :@selector(paste:) :@"v" :NSEventModifierFlagCommand]];
|
||||||
|
[editMenu addItem:[self newMenuItem:@"Paste and Match Style" :@selector(pasteAsRichText:) :@"v" :(NSEventModifierFlagOption | NSEventModifierFlagShift | NSEventModifierFlagCommand)]];
|
||||||
|
[editMenu addItem:[self newMenuItem:@"Delete" :@selector(delete:) :[self accel:@"backspace"] :0]];
|
||||||
|
[editMenu addItem:[self newMenuItem:@"Select All" :@selector(selectAll:) :@"a" :NSEventModifierFlagCommand]];
|
||||||
|
[editMenu addItem:[NSMenuItem separatorItem]];
|
||||||
|
// NSMenuItem *speechMenuItem = [[NSMenuItem new] autorelease];
|
||||||
|
// [speechMenuItem setTitle:@"Speech"];
|
||||||
|
// [editMenu addItem:speechMenuItem];
|
||||||
|
WailsMenu *speechMenu = [[[WailsMenu new] initWithNSTitle:@"Speech"] autorelease];
|
||||||
|
[speechMenu addItem:[self newMenuItem:@"Start Speaking" :@selector(startSpeaking:) :@""]];
|
||||||
|
[speechMenu addItem:[self newMenuItem:@"Stop Speaking" :@selector(stopSpeaking:) :@""]];
|
||||||
|
[editMenu appendSubmenu:speechMenu];
|
||||||
|
[self appendSubmenu:editMenu];
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void*) AppendMenuItem :(WailsContext*)ctx :(NSString*)label :(NSString *)shortcutKey :(int)modifiers :(bool)disabled :(bool)checked :(int)menuItemID {
|
||||||
|
|
||||||
|
NSString *nslabel = @"";
|
||||||
|
if (label != nil ) {
|
||||||
|
nslabel = label;
|
||||||
|
}
|
||||||
|
WailsMenuItem *menuItem = [WailsMenuItem new];
|
||||||
|
|
||||||
|
// Label
|
||||||
|
menuItem.title = nslabel;
|
||||||
|
|
||||||
|
// Process callback
|
||||||
|
menuItem.menuItemID = menuItemID;
|
||||||
|
menuItem.action = @selector(handleClick);
|
||||||
|
menuItem.target = menuItem;
|
||||||
|
|
||||||
|
// Shortcut
|
||||||
|
if (shortcutKey != nil) {
|
||||||
|
[menuItem setKeyEquivalent:[self accel:shortcutKey]];
|
||||||
|
[menuItem setKeyEquivalentModifierMask:modifiers];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enabled/Disabled
|
||||||
|
[menuItem setEnabled:!disabled];
|
||||||
|
|
||||||
|
// Checked
|
||||||
|
[menuItem setState:(checked ? NSControlStateValueOn : NSControlStateValueOff)];
|
||||||
|
|
||||||
|
[self addItem:menuItem];
|
||||||
|
return menuItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) AppendSeparator {
|
||||||
|
[self addItem:[NSMenuItem separatorItem]];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (NSString*) accel :(NSString*)key {
|
||||||
|
|
||||||
|
// Guard against no accelerator key
|
||||||
|
if( key == NULL ) {
|
||||||
|
return @"";
|
||||||
|
}
|
||||||
|
|
||||||
|
if( [key isEqualToString:@"backspace"] ) {
|
||||||
|
return unicode(0x0008);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"tab"] ) {
|
||||||
|
return unicode(0x0009);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"return"] ) {
|
||||||
|
return unicode(0x000d);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"enter"] ) {
|
||||||
|
return unicode(0x000d);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"escape"] ) {
|
||||||
|
return unicode(0x001b);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"left"] ) {
|
||||||
|
return unicode(0x001c);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"right"] ) {
|
||||||
|
return unicode(0x001d);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"up"] ) {
|
||||||
|
return unicode(0x001e);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"down"] ) {
|
||||||
|
return unicode(0x001f);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"space"] ) {
|
||||||
|
return unicode(0x0020);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"delete"] ) {
|
||||||
|
return unicode(0x007f);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"home"] ) {
|
||||||
|
return unicode(0x2196);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"end"] ) {
|
||||||
|
return unicode(0x2198);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"page up"] ) {
|
||||||
|
return unicode(0x21de);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"page down"] ) {
|
||||||
|
return unicode(0x21df);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f1"] ) {
|
||||||
|
return unicode(0xf704);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f2"] ) {
|
||||||
|
return unicode(0xf705);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f3"] ) {
|
||||||
|
return unicode(0xf706);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f4"] ) {
|
||||||
|
return unicode(0xf707);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f5"] ) {
|
||||||
|
return unicode(0xf708);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f6"] ) {
|
||||||
|
return unicode(0xf709);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f7"] ) {
|
||||||
|
return unicode(0xf70a);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f8"] ) {
|
||||||
|
return unicode(0xf70b);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f9"] ) {
|
||||||
|
return unicode(0xf70c);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f10"] ) {
|
||||||
|
return unicode(0xf70d);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f11"] ) {
|
||||||
|
return unicode(0xf70e);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f12"] ) {
|
||||||
|
return unicode(0xf70f);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f13"] ) {
|
||||||
|
return unicode(0xf710);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f14"] ) {
|
||||||
|
return unicode(0xf711);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f15"] ) {
|
||||||
|
return unicode(0xf712);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f16"] ) {
|
||||||
|
return unicode(0xf713);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f17"] ) {
|
||||||
|
return unicode(0xf714);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f18"] ) {
|
||||||
|
return unicode(0xf715);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f19"] ) {
|
||||||
|
return unicode(0xf716);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f20"] ) {
|
||||||
|
return unicode(0xf717);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f21"] ) {
|
||||||
|
return unicode(0xf718);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f22"] ) {
|
||||||
|
return unicode(0xf719);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f23"] ) {
|
||||||
|
return unicode(0xf71a);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f24"] ) {
|
||||||
|
return unicode(0xf71b);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f25"] ) {
|
||||||
|
return unicode(0xf71c);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f26"] ) {
|
||||||
|
return unicode(0xf71d);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f27"] ) {
|
||||||
|
return unicode(0xf71e);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f28"] ) {
|
||||||
|
return unicode(0xf71f);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f29"] ) {
|
||||||
|
return unicode(0xf720);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f30"] ) {
|
||||||
|
return unicode(0xf721);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f31"] ) {
|
||||||
|
return unicode(0xf722);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f32"] ) {
|
||||||
|
return unicode(0xf723);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f33"] ) {
|
||||||
|
return unicode(0xf724);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f34"] ) {
|
||||||
|
return unicode(0xf725);
|
||||||
|
}
|
||||||
|
if( [key isEqualToString:@"f35"] ) {
|
||||||
|
return unicode(0xf726);
|
||||||
|
}
|
||||||
|
// if( [key isEqualToString:@"Insert"] ) {
|
||||||
|
// return unicode(0xf727);
|
||||||
|
// }
|
||||||
|
// if( [key isEqualToString:@"PrintScreen"] ) {
|
||||||
|
// return unicode(0xf72e);
|
||||||
|
// }
|
||||||
|
// if( [key isEqualToString:@"ScrollLock"] ) {
|
||||||
|
// return unicode(0xf72f);
|
||||||
|
// }
|
||||||
|
if( [key isEqualToString:@"numLock"] ) {
|
||||||
|
return unicode(0xf739);
|
||||||
|
}
|
||||||
|
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
22
v2/internal/frontend/desktop/darwin/WailsMenuItem.h
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// WailsMenuItem.h
|
||||||
|
// test
|
||||||
|
//
|
||||||
|
// Created by Lea Anthony on 27/10/21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef WailsMenuItem_h
|
||||||
|
#define WailsMenuItem_h
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
@interface WailsMenuItem : NSMenuItem
|
||||||
|
|
||||||
|
@property int menuItemID;
|
||||||
|
|
||||||
|
- (void) handleClick;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* WailsMenuItem_h */
|
||||||
20
v2/internal/frontend/desktop/darwin/WailsMenuItem.m
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// WailsMenuItem.m
|
||||||
|
// test
|
||||||
|
//
|
||||||
|
// Created by Lea Anthony on 27/10/21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "WailsMenuItem.h"
|
||||||
|
#include "message.h"
|
||||||
|
|
||||||
|
|
||||||
|
@implementation WailsMenuItem
|
||||||
|
|
||||||
|
- (void) handleClick {
|
||||||
|
processCallback(self.menuItemID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -8,10 +8,17 @@
|
|||||||
#ifndef WindowDelegate_h
|
#ifndef WindowDelegate_h
|
||||||
#define WindowDelegate_h
|
#define WindowDelegate_h
|
||||||
|
|
||||||
|
#import "WailsContext.h"
|
||||||
|
|
||||||
@interface WindowDelegate : NSObject <NSWindowDelegate>
|
@interface WindowDelegate : NSObject <NSWindowDelegate>
|
||||||
|
|
||||||
@property bool hideOnClose;
|
@property bool hideOnClose;
|
||||||
|
|
||||||
|
@property (assign) WailsContext* ctx;
|
||||||
|
|
||||||
|
- (void)windowDidExitFullScreen:(NSNotification *)notification;
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,15 +9,29 @@
|
|||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "WindowDelegate.h"
|
#import "WindowDelegate.h"
|
||||||
#import "message.h"
|
#import "message.h"
|
||||||
|
#import "WailsContext.h"
|
||||||
|
|
||||||
@implementation WindowDelegate
|
@implementation WindowDelegate
|
||||||
|
- (BOOL)windowShouldClose:(WailsWindow *)sender {
|
||||||
- (BOOL)windowShouldClose:(NSWindow *)sender {
|
if( self.hideOnClose ) {
|
||||||
[sender orderOut:nil];
|
[NSApp hide:nil];
|
||||||
if( self.hideOnClose == false ) {
|
return false;
|
||||||
processMessage("Q");
|
|
||||||
}
|
}
|
||||||
return !self.hideOnClose;
|
processMessage("Q");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)windowDidExitFullScreen:(NSNotification *)notification {
|
||||||
|
[self.ctx.mainWindow applyWindowConstraints];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)windowWillEnterFullScreen:(NSNotification *)notification {
|
||||||
|
[self.ctx.mainWindow disableWindowConstraints];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSApplicationPresentationOptions)window:(WailsWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions {
|
||||||
|
return NSApplicationPresentationAutoHideToolbar | NSApplicationPresentationAutoHideMenuBar | NSApplicationPresentationFullScreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||