From 24530d9da4d4ccebe43415a87b9d39c98e1b1970 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 24 Oct 2019 09:36:42 +1100 Subject: [PATCH 01/10] fix: force install when node_modules missing (#268) --- cmd/helpers.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cmd/helpers.go b/cmd/helpers.go index b251333f..4d188e97 100644 --- a/cmd/helpers.go +++ b/cmd/helpers.go @@ -219,6 +219,15 @@ func InstallFrontendDeps(projectDir string, projectOptions *ProjectOptions, forc const md5sumFile = "package.json.md5" + // If node_modules does not exist, force a rebuild. + nodeModulesPath, err := filepath.Abs(filepath.Join(".", "node_modules")) + if err != nil { + return err + } + if !fs.DirExists(nodeModulesPath) { + forceRebuild = true + } + // If we aren't forcing the install and the md5sum file exists if !forceRebuild && fs.FileExists(md5sumFile) { // Yes - read contents From 315ef5f7ea352122c08434d84db05063aab3f4e7 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 24 Oct 2019 16:04:32 +1100 Subject: [PATCH 02/10] fix: detect encoding on windows (#266) * fix: linting * chore: bump version --- cmd/version.go | 2 +- config.go | 7 +++++-- go.mod | 4 +++- go.sum | 3 +++ runtime/window.go | 51 ++++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 62 insertions(+), 5 deletions(-) diff --git a/cmd/version.go b/cmd/version.go index fed0473c..c9afe756 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -1,4 +1,4 @@ package cmd // Version - Wails version -const Version = "v0.18.4" +const Version = "v0.18.7-pre" diff --git a/config.go b/config.go index 4f87a6ad..57f27461 100644 --- a/config.go +++ b/config.go @@ -1,6 +1,9 @@ package wails -import "github.com/leaanthony/mewn" +import ( + "github.com/leaanthony/mewn" + "github.com/wailsapp/wails/runtime" +) // AppConfig is the configuration structure used when creating a Wails App object type AppConfig struct { @@ -65,7 +68,7 @@ func (a *AppConfig) merge(in *AppConfig) error { a.CSS = in.CSS } if in.Title != "" { - a.Title = in.Title + a.Title = runtime.ProcessEncoding(in.Title) } if in.Colour != "" { diff --git a/go.mod b/go.mod index d725cb72..fe1ff809 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,7 @@ module github.com/wailsapp/wails require ( github.com/Masterminds/semver v1.4.2 + github.com/abadojack/whatlanggo v1.0.1 github.com/dchest/cssmin v0.0.0-20151210170030-fb8d9b44afdc // indirect github.com/dchest/htmlmin v0.0.0-20150526090704-e254725e81ac github.com/dchest/jsmin v0.0.0-20160823214000-faeced883947 // indirect @@ -26,6 +27,7 @@ require ( golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529 // indirect golang.org/x/net v0.0.0-20190509222800-a4d6f7feada5 // indirect golang.org/x/sys v0.0.0-20190509141414-a5b02f93d862 + golang.org/x/text v0.3.0 gopkg.in/AlecAivazis/survey.v1 v1.8.4 gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22 -) +) \ No newline at end of file diff --git a/go.sum b/go.sum index 96626b9a..96ea28f1 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITg github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= +github.com/abadojack/whatlanggo v1.0.1 h1:19N6YogDnf71CTHm3Mp2qhYfkRdyvbgwWdd2EPxJRG4= +github.com/abadojack/whatlanggo v1.0.1/go.mod h1:66WiQbSbJBIlOZMsvbKe5m6pzQovxCH9B/K8tQB2uoc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -85,6 +87,7 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190509141414-a5b02f93d862 h1:rM0ROo5vb9AdYJi1110yjWGMej9ITfKddS89P3Fkhug= golang.org/x/sys v0.0.0-20190509141414-a5b02f93d862/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/AlecAivazis/survey.v1 v1.8.4 h1:10xXXN3wgIhPheb5NI58zFgZv32Ana7P3Tl4shW+0Qc= gopkg.in/AlecAivazis/survey.v1 v1.8.4/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= diff --git a/runtime/window.go b/runtime/window.go index ebad1e25..960e02b7 100644 --- a/runtime/window.go +++ b/runtime/window.go @@ -1,6 +1,54 @@ package runtime -import "github.com/wailsapp/wails/lib/interfaces" +import ( + "bytes" + "runtime" + + "github.com/abadojack/whatlanggo" + "github.com/wailsapp/wails/lib/interfaces" + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/japanese" + "golang.org/x/text/encoding/korean" + "golang.org/x/text/encoding/simplifiedchinese" + "golang.org/x/text/transform" +) + +func detectEncoding(text string) (encoding.Encoding, string) { + // korean + var enc encoding.Encoding + info := whatlanggo.Detect(text) + //fmt.Println("Language:", info.Lang.String(), " Script:", whatlanggo.Scripts[info.Script], " Confidence: ", info.Confidence) + switch info.Lang.String() { + case "Korean": + enc = korean.EUCKR + case "Mandarin": + enc = simplifiedchinese.GBK + case "Japanese": + enc = japanese.EUCJP + } + return enc, info.Lang.String() +} + +// ProcessEncoding attempts to convert CKJ strings to UTF-8 +func ProcessEncoding(text string) string { + if runtime.GOOS != "windows" { + return text + } + + encoding, _ := detectEncoding(text) + if encoding != nil { + var bufs bytes.Buffer + wr := transform.NewWriter(&bufs, encoding.NewEncoder()) + _, err := wr.Write([]byte(text)) + defer wr.Close() + if err != nil { + return "" + } + + return bufs.String() + } + return text +} // Window exposes an interface for manipulating the window type Window struct { @@ -31,6 +79,7 @@ func (r *Window) UnFullscreen() { // SetTitle sets the the window title func (r *Window) SetTitle(title string) { + title = ProcessEncoding(title) r.renderer.SetTitle(title) } From 6795f6c678cc5b9a9a78de33980eb4c245476e74 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 24 Oct 2019 16:11:50 +1100 Subject: [PATCH 03/10] Migrate tool (#270) Experimental migration tool for projects < v1.0.0 --- cmd/program.go | 13 ++ cmd/project.go | 29 +++ cmd/wails/15_migrate.go | 408 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 450 insertions(+) create mode 100644 cmd/wails/15_migrate.go diff --git a/cmd/program.go b/cmd/program.go index 3b81b225..680dd17e 100644 --- a/cmd/program.go +++ b/cmd/program.go @@ -100,6 +100,19 @@ func (p *ProgramHelper) InstallGoPackage(packageName string) error { return err } +// InstallNPMPackage installs the given npm package +func (p *ProgramHelper) InstallNPMPackage(packageName string, save bool) error { + args := strings.Split("install "+packageName, " ") + if save { + args = append(args, "--save") + } + _, stderr, err := p.shell.Run("npm", args...) + if err != nil { + fmt.Println(stderr) + } + return err +} + // RunCommand runs the given command func (p *ProgramHelper) RunCommand(command string) error { args := strings.Split(command, " ") diff --git a/cmd/project.go b/cmd/project.go index a30c867c..91de152c 100644 --- a/cmd/project.go +++ b/cmd/project.go @@ -13,6 +13,18 @@ import ( "github.com/leaanthony/slicer" ) +// PackageManager indicates different package managers +type PackageManager int + +const ( + // UNKNOWN package manager + UNKNOWN PackageManager = iota + // NPM package manager + NPM + // YARN package manager + YARN +) + type author struct { Name string `json:"name"` Email string `json:"email"` @@ -153,6 +165,23 @@ func (po *ProjectOptions) Defaults() { po.WailsVersion = Version } +// GetNPMBinaryName returns the type of package manager used by the project +func (po *ProjectOptions) GetNPMBinaryName() (PackageManager, error) { + if po.FrontEnd == nil { + return UNKNOWN, fmt.Errorf("No frontend specified in project options") + } + + if strings.Index(po.FrontEnd.Install, "npm") > -1 { + return NPM, nil + } + + if strings.Index(po.FrontEnd.Install, "yarn") > -1 { + return YARN, nil + } + + return UNKNOWN, nil +} + // PromptForInputs asks the user to input project details func (po *ProjectOptions) PromptForInputs() error { diff --git a/cmd/wails/15_migrate.go b/cmd/wails/15_migrate.go new file mode 100644 index 00000000..39a6ddb4 --- /dev/null +++ b/cmd/wails/15_migrate.go @@ -0,0 +1,408 @@ +package main + +import ( + "bufio" + "fmt" + "io/ioutil" + "log" + "os" + "path/filepath" + "regexp" + "strings" + + "github.com/Masterminds/semver" + "github.com/leaanthony/spinner" + "github.com/wailsapp/wails/cmd" +) + +// Constants +var checkSpinner = spinner.NewSpinner() +var migrateProjectOptions = &cmd.ProjectOptions{} +var migrateFS = cmd.NewFSHelper() +var migrateGithub = cmd.NewGitHubHelper() +var programHelper = cmd.NewProgramHelper() +var lessThanV1 *semver.Constraints + +// The user's go.mod +var goMod string +var goModFile string + +// The user's main.js +var mainJSFile string +var mainJSContents string + +// Frontend directory +var frontEndDir string + +func init() { + + var dryrun bool + var err error + + lessThanV1, err = semver.NewConstraint("< v1.0.0") + if err != nil { + log.Fatal(err) + } + + // var forceRebuild = false + checkSpinner.SetSpinSpeed(50) + + commandDescription := `EXPERIMENTAL - This command attempts to migrate projects to the latest Wails version.` + updateCmd := app.Command("migrate", "Migrate projects to latest Wails release"). + LongDescription(commandDescription). + BoolFlag("dryrun", "Only display what would be done", &dryrun) + + updateCmd.Action(func() error { + + message := "Migrate Project" + logger.PrintSmallBanner(message) + logger.Red("WARNING: This is an experimental command. Ensure you have backups of your project!") + logger.Red("It currently only supports npm based projects.") + fmt.Println() + + // Check project directory + err := checkProjectDirectory() + if err != nil { + return err + } + + // Find Wails version from go.mod + wailsVersion, err := getWailsVersion() + if err != nil { + return err + } + + // Get latest stable version + var latestVersion *semver.Version + latestVersion, err = getLatestWailsVersion() + if err != nil { + return err + } + + var canMigrate bool + canMigrate, err = canMigrateVersion(wailsVersion, latestVersion) + if err != nil { + return err + } + + if !canMigrate { + return nil + } + + // Check for wailsbridge + wailsBridge, err := checkWailsBridge() + if err != nil { + return err + } + + // Is main.js using bridge.Init() + canUpdateMainJS, err := checkMainJS() + if err != nil { + return err + } + + // TODO: Check if we are using legacy js runtime + + // Operations + logger.Yellow("Operations to perform:") + + logger.Yellowf(" - Update to Wails v%s\n", latestVersion) + + if len(wailsBridge) > 0 { + logger.Yellow(" - Delete wailsbridge.js") + } + + if canUpdateMainJS { + logger.Yellow(" - Patch main.js") + } + + logger.Yellow(" - Ensure '@wailsapp/runtime` module is installed") + + if dryrun { + logger.White("Exiting: Dry Run") + return nil + } + + logger.Red("*WARNING* About to modify your project!") + logger.Red("Type 'YES' to continue: ") + scanner := bufio.NewScanner(os.Stdin) + scanner.Scan() + input := scanner.Text() + if input != "YES" { + logger.Red("ABORTED!") + return nil + } + + logger.Yellow("Let's do this!") + + err = updateWailsVersion(wailsVersion, latestVersion) + if err != nil { + return err + } + + if len(wailsBridge) > 0 { + err = deleteWailsBridge(wailsBridge) + if err != nil { + return err + } + } + + if canUpdateMainJS { + err = patchMainJS() + if err != nil { + return err + } + } + + // Install runtime + err = installWailsRuntime() + if err != nil { + return err + } + + fmt.Println() + logger.Yellow("Migration complete! Check project by running `wails build`.") + return nil + }) +} + +func checkProjectDirectory() error { + // Get versions + checkSpinner.Start("Check Project Directory") + + // Check we are in project directory + err := migrateProjectOptions.LoadConfig(migrateFS.Cwd()) + if err != nil { + checkSpinner.Error() + return fmt.Errorf("Unable to find 'project.json'. Please check you are in a Wails project directory") + } + + checkSpinner.Success() + return nil +} + +func getWailsVersion() (*semver.Version, error) { + checkSpinner.Start("Get Wails Version") + var result *semver.Version + + // Load file + var err error + goModFile, err = filepath.Abs(filepath.Join(".", "go.mod")) + if err != nil { + checkSpinner.Error() + return nil, fmt.Errorf("Unable to load go.mod at %s", goModFile) + } + goMod, err = migrateFS.LoadAsString(goModFile) + if err != nil { + checkSpinner.Error() + return nil, fmt.Errorf("Unable to load go.mod") + } + + // Find wails version + versionRegexp := regexp.MustCompile(`.*github.com/wailsapp/wails.*(v\d+.\d+.\d+)`) + versions := versionRegexp.FindStringSubmatch(goMod) + + if len(versions) != 2 { + return nil, fmt.Errorf("Unable to determine Wails version") + } + + version := versions[1] + result, err = semver.NewVersion(version) + if err != nil { + return nil, fmt.Errorf("Unable to parse Wails version: %s", version) + } + checkSpinner.Success("Found Wails Version: " + version) + return result, nil + +} + +func canMigrateVersion(wailsVersion *semver.Version, latestVersion *semver.Version) (bool, error) { + checkSpinner.Start("Checking ability to Migrate") + + // Check if we are at the latest version!!!! + if wailsVersion.Equal(latestVersion) || wailsVersion.GreaterThan(latestVersion) { + checkSpinner.Errorf("Checking ability to Migrate: No! (v%s >= v%s)", wailsVersion, latestVersion) + return false, nil + } + + // Check for < v1.0.0 + if lessThanV1.Check(wailsVersion) { + checkSpinner.Successf("Checking ability to Migrate: Yes! (v%s < v1.0.0)", wailsVersion) + return true, nil + } + checkSpinner.Error("Unable to migrate") + return false, fmt.Errorf("No migration rules for version %s", wailsVersion) +} + +func checkWailsBridge() (string, error) { + checkSpinner.Start("Checking if legacy Wails Bridge present") + + // Check frontend dir is available + if migrateProjectOptions.FrontEnd == nil || + len(migrateProjectOptions.FrontEnd.Dir) == 0 || + !migrateFS.DirExists(migrateProjectOptions.FrontEnd.Dir) { + checkSpinner.Error("Unable to determine frontend directory") + return "", fmt.Errorf("Unable to determine frontend directory") + } + + frontEndDir = migrateProjectOptions.FrontEnd.Dir + + wailsBridgePath, err := filepath.Abs(filepath.Join(".", frontEndDir, "src", "wailsbridge.js")) + if err != nil { + checkSpinner.Error(err.Error()) + return "", err + } + + // If it doesn't exist, return blank string + if !migrateFS.FileExists(wailsBridgePath) { + checkSpinner.Success("Checking if legacy Wails Bridge present: No") + return "", nil + } + + checkSpinner.Success("Checking if legacy Wails Bridge present: Yes") + return wailsBridgePath, nil + +} + +// This function determines if the main.js file using wailsbridge can be auto-updated +func checkMainJS() (bool, error) { + + checkSpinner.Start("Checking if main.js can be migrated") + var err error + + // Check main.js is there + if migrateProjectOptions.FrontEnd == nil || + len(migrateProjectOptions.FrontEnd.Dir) == 0 || + !migrateFS.DirExists(migrateProjectOptions.FrontEnd.Dir) { + checkSpinner.Error("Unable to determine frontend directory") + return false, fmt.Errorf("Unable to determine frontend directory") + } + + frontEndDir = migrateProjectOptions.FrontEnd.Dir + + mainJSFile, err = filepath.Abs(filepath.Join(".", frontEndDir, "src", "main.js")) + if err != nil { + checkSpinner.Error("Unable to find main.js") + return false, err + } + + mainJSContents, err = migrateFS.LoadAsString(mainJSFile) + if err != nil { + checkSpinner.Error("Unable to load main.js") + return false, err + } + + // Check we have a line like: import Bridge from "./wailsbridge"; + if strings.Index(mainJSContents, `import Bridge from "./wailsbridge";`) == -1 { + checkSpinner.Success("Checking if main.js can be migrated: No - Cannot find `import Bridge`") + return false, nil + } + + // Check we have a line like: Bridge.Start(() => { + if strings.Index(mainJSContents, `Bridge.Start(`) == -1 { + checkSpinner.Success("Checking if main.js can be migrated: No - Cannot find `Bridge.Start`") + return false, nil + } + checkSpinner.Success("Checking if main.js can be migrated: Yes") + return true, nil +} + +func getLatestWailsVersion() (*semver.Version, error) { + checkSpinner.Start("Checking GitHub for latest Wails version") + version, err := migrateGithub.GetLatestStableRelease() + if err != nil { + checkSpinner.Error("Checking GitHub for latest Wails version: Failed") + return nil, err + } + + checkSpinner.Successf("Checking GitHub for latest Wails version: v%s", version) + return version.Version, nil +} + +func updateWailsVersion(currentVersion, latestVersion *semver.Version) error { + // Patch go.mod + checkSpinner.Start("Patching go.mod") + + wailsModule := "github.com/wailsapp/wails" + old := fmt.Sprintf("%s v%s", wailsModule, currentVersion) + new := fmt.Sprintf("%s v%s", wailsModule, latestVersion) + + goMod = strings.Replace(goMod, old, new, -1) + err := ioutil.WriteFile(goModFile, []byte(goMod), 0600) + if err != nil { + checkSpinner.Error() + return err + } + + checkSpinner.Success() + return nil +} + +func deleteWailsBridge(bridgeFilename string) error { + // Patch go.mod + checkSpinner.Start("Delete legacy wailsbridge.js") + + err := migrateFS.RemoveFile(bridgeFilename) + if err != nil { + checkSpinner.Error() + return err + } + + checkSpinner.Success() + return nil +} + +func patchMainJS() error { + // Patch main.js + checkSpinner.Start("Patching main.js") + + // Patch import line + oldImportLine := `import Bridge from "./wailsbridge";` + newImportLine := `import * as Wails from "@wailsapp/runtime";` + mainJSContents = strings.Replace(mainJSContents, oldImportLine, newImportLine, -1) + + // Patch Start line + oldStartLine := `Bridge.Start` + newStartLine := `Wails.Init` + mainJSContents = strings.Replace(mainJSContents, oldStartLine, newStartLine, -1) + + err := ioutil.WriteFile(mainJSFile, []byte(mainJSContents), 0600) + if err != nil { + checkSpinner.Error() + return err + } + + checkSpinner.Success() + return nil +} + +func installWailsRuntime() error { + + checkSpinner.Start("Installing @wailsapp/runtime module") + + // Change to the frontend directory + err := os.Chdir(frontEndDir) + if err != nil { + checkSpinner.Error() + return nil + } + + // Determine package manager + packageManager, err := migrateProjectOptions.GetNPMBinaryName() + if err != nil { + checkSpinner.Error() + return nil + } + + switch packageManager { + case cmd.NPM: + // npm install --save @wailsapp/runtime + programHelper.InstallNPMPackage("@wailsapp/runtime", true) + default: + checkSpinner.Error() + return fmt.Errorf("Unknown package manager") + } + + checkSpinner.Success() + return nil +} From c51f0cad6fc14a3b5d3c3d6403e40ebf51f6c9aa Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 24 Oct 2019 16:13:42 +1100 Subject: [PATCH 04/10] chore: version bump --- cmd/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/version.go b/cmd/version.go index c9afe756..e9b54a57 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -1,4 +1,4 @@ package cmd // Version - Wails version -const Version = "v0.18.7-pre" +const Version = "v0.18.8-pre" From 50a0bc770195180d6657392a44fe3ab0088250a8 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 25 Oct 2019 12:04:08 +1100 Subject: [PATCH 05/10] fix: add flag to fix windows builds (#272) --- lib/renderer/webview/webview.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/renderer/webview/webview.go b/lib/renderer/webview/webview.go index 07a42813..f2cde51a 100755 --- a/lib/renderer/webview/webview.go +++ b/lib/renderer/webview/webview.go @@ -14,7 +14,7 @@ package webview #cgo linux openbsd freebsd CFLAGS: -DWEBVIEW_GTK=1 -Wno-deprecated-declarations #cgo linux openbsd freebsd pkg-config: gtk+-3.0 webkit2gtk-4.0 -#cgo windows CFLAGS: -DWEBVIEW_WINAPI=1 +#cgo windows CFLAGS: -DWEBVIEW_WINAPI=1 -std=c99 #cgo windows LDFLAGS: -lole32 -lcomctl32 -loleaut32 -luuid -lgdi32 #cgo darwin CFLAGS: -DWEBVIEW_COCOA=1 -x objective-c From 0819207e335c0d9be33a8a43c42aaa6533e0eb55 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 25 Oct 2019 12:05:51 +1100 Subject: [PATCH 06/10] Bump version to v0.18.9-pre --- cmd/version.go | 2 +- lib/renderer/webview/webview.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cmd/version.go b/cmd/version.go index e9b54a57..a752017c 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -1,4 +1,4 @@ package cmd // Version - Wails version -const Version = "v0.18.8-pre" +const Version = "v0.18.9-pre" diff --git a/lib/renderer/webview/webview.go b/lib/renderer/webview/webview.go index f2cde51a..71851688 100755 --- a/lib/renderer/webview/webview.go +++ b/lib/renderer/webview/webview.go @@ -1,6 +1,5 @@ -// Package wails implements Go bindings to https://github.com/zserge/webview C library. +// Package webview implements Go bindings to https://github.com/zserge/webview C library. // It is a modified version of webview.go from that repository - // Bindings closely repeat the C APIs and include both, a simplified // single-function API to just open a full-screen webview window, and a more // advanced and featureful set of APIs, including Go-to-JavaScript bindings. From 85a64914aab5b359d29151be30bfbc47dfb7b3e2 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 25 Oct 2019 12:33:29 +1100 Subject: [PATCH 07/10] 261 korean fonts (#273) * fix: linting * chore: bump version * fix: unicode text for Windows --- cmd/version.go | 2 +- lib/renderer/webview/webview.go | 2 +- lib/renderer/webview/webview.h | 40 +++++++++++++++++++++++++-------- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/cmd/version.go b/cmd/version.go index a752017c..c9afe756 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -1,4 +1,4 @@ package cmd // Version - Wails version -const Version = "v0.18.9-pre" +const Version = "v0.18.7-pre" diff --git a/lib/renderer/webview/webview.go b/lib/renderer/webview/webview.go index 71851688..3a300033 100755 --- a/lib/renderer/webview/webview.go +++ b/lib/renderer/webview/webview.go @@ -13,7 +13,7 @@ package webview #cgo linux openbsd freebsd CFLAGS: -DWEBVIEW_GTK=1 -Wno-deprecated-declarations #cgo linux openbsd freebsd pkg-config: gtk+-3.0 webkit2gtk-4.0 -#cgo windows CFLAGS: -DWEBVIEW_WINAPI=1 -std=c99 +#cgo windows CFLAGS: -DWEBVIEW_WINAPI=1 -std=c99 -DUNICODE=1 #cgo windows LDFLAGS: -lole32 -lcomctl32 -loleaut32 -luuid -lgdi32 #cgo darwin CFLAGS: -DWEBVIEW_COCOA=1 -x objective-c diff --git a/lib/renderer/webview/webview.h b/lib/renderer/webview/webview.h index 047a5479..f6c4e36a 100644 --- a/lib/renderer/webview/webview.h +++ b/lib/renderer/webview/webview.h @@ -1038,7 +1038,7 @@ struct webview_priv return S_FALSE; } - static const TCHAR *classname = "WebView"; + static const TCHAR *classname = TEXT("WebView"); static const SAFEARRAYBOUND ArrayBound = {1, 0}; static IOleClientSiteVtbl MyIOleClientSiteTable = { @@ -1227,7 +1227,7 @@ struct webview_priv } VariantInit(&myURL); myURL.vt = VT_BSTR; -#ifndef UNICODE +// #ifndef UNICODE { wchar_t *buffer = webview_to_utf16(webPageName); if (buffer == NULL) @@ -1237,9 +1237,9 @@ struct webview_priv myURL.bstrVal = SysAllocString(buffer); GlobalFree(buffer); } -#else - myURL.bstrVal = SysAllocString(webPageName); -#endif +// #else +// myURL.bstrVal = SysAllocString(webPageName); +// #endif if (!myURL.bstrVal) { badalloc: @@ -1277,7 +1277,7 @@ struct webview_priv if (!SafeArrayAccessData(sfArray, (void **)&pVar)) { pVar->vt = VT_BSTR; -#ifndef UNICODE +// #ifndef UNICODE { wchar_t *buffer = webview_to_utf16(url); if (buffer == NULL) @@ -1287,9 +1287,9 @@ struct webview_priv bstr = SysAllocString(buffer); GlobalFree(buffer); } -#else - bstr = SysAllocString(string); -#endif +// #else +// bstr = SysAllocString(url); +// #endif if ((pVar->bstrVal = bstr)) { htmlDoc2->lpVtbl->write(htmlDoc2, sfArray); @@ -1404,6 +1404,7 @@ struct webview_priv { return -1; } + ZeroMemory(&wc, sizeof(WNDCLASSEX)); wc.cbSize = sizeof(WNDCLASSEX); wc.hInstance = hInstance; @@ -1431,10 +1432,24 @@ struct webview_priv rect.bottom = rect.bottom - rect.top + top; rect.top = top; +#ifdef UNICODE + wchar_t *u16title = webview_to_utf16(w->title); + if (u16title == NULL) + { + return -1; + } + w->priv.hwnd = + CreateWindowEx(0, classname, u16title, style, rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, + HWND_DESKTOP, NULL, hInstance, (void *)w); +#else + w->priv.hwnd = CreateWindowEx(0, classname, w->title, style, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, HWND_DESKTOP, NULL, hInstance, (void *)w); +#endif + if (w->priv.hwnd == 0) { OleUninitialize(); @@ -1445,7 +1460,14 @@ struct webview_priv DisplayHTMLPage(w); +#ifdef UNICODE + SetWindowText(w->priv.hwnd, u16title); + GlobalFree(u16title); +#else SetWindowText(w->priv.hwnd, w->title); +#endif + + ShowWindow(w->priv.hwnd, SW_SHOWDEFAULT); UpdateWindow(w->priv.hwnd); SetFocus(w->priv.hwnd); From f5d3fb0848144169bd21da998581b81208c0d3fb Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 25 Oct 2019 12:34:43 +1100 Subject: [PATCH 08/10] release v0.18.10-pre --- cmd/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/version.go b/cmd/version.go index c9afe756..c988fea0 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -1,4 +1,4 @@ package cmd // Version - Wails version -const Version = "v0.18.7-pre" +const Version = "v0.18.10-pre" From 2db1624fafb7fcad4c9327a1efe9b4cc685ae032 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 25 Oct 2019 17:37:36 +1100 Subject: [PATCH 09/10] 274 support spaces in windows paths (#275) * fix: escape windows commands * fix: allow spaces in path to windres * Update go.mod --- cmd/package.go | 11 +++++++++-- cmd/program.go | 1 + cmd/windres.bat | 1 + go.mod | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 cmd/windres.bat diff --git a/cmd/package.go b/cmd/package.go index 558a6794..c9b0ef83 100644 --- a/cmd/package.go +++ b/cmd/package.go @@ -191,8 +191,15 @@ func (b *PackageHelper) PackageWindows(po *ProjectOptions, cleanUp bool) error { // Build syso sysofile := filepath.Join(b.fs.Cwd(), basename+"-res.syso") - windresCommand := []string{"windres", "-o", sysofile, tgtRCFile} - err := NewProgramHelper().RunCommandArray(windresCommand) + + batfile, err := fs.LocalDir(".") + if err != nil { + return err + } + + windresBatFile := filepath.Join(batfile.fullPath, "windres.bat") + windresCommand := []string{windresBatFile, sysofile, tgtRCFile} + err = NewProgramHelper().RunCommandArray(windresCommand) if err != nil { return err } diff --git a/cmd/program.go b/cmd/program.go index 680dd17e..81816bdb 100644 --- a/cmd/program.go +++ b/cmd/program.go @@ -128,6 +128,7 @@ func (p *ProgramHelper) RunCommandArray(args []string, dir ...string) error { fmt.Printf("ERROR: Looks like '%s' isn't installed. Please install and try again.", program) return err } + args = args[1:] var stderr string var stdout string diff --git a/cmd/windres.bat b/cmd/windres.bat new file mode 100644 index 00000000..1ce33a4a --- /dev/null +++ b/cmd/windres.bat @@ -0,0 +1 @@ +windres.exe -o %1 %2 \ No newline at end of file diff --git a/go.mod b/go.mod index fe1ff809..435d02d3 100644 --- a/go.mod +++ b/go.mod @@ -30,4 +30,4 @@ require ( golang.org/x/text v0.3.0 gopkg.in/AlecAivazis/survey.v1 v1.8.4 gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22 -) \ No newline at end of file +) From 52e6091f0f7d61636beae0938d0f1111776d989e Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 25 Oct 2019 17:39:12 +1100 Subject: [PATCH 10/10] release v0.18.11-pre --- cmd/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/version.go b/cmd/version.go index c988fea0..95799eb4 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -1,4 +1,4 @@ package cmd // Version - Wails version -const Version = "v0.18.10-pre" +const Version = "v0.18.11-pre"