* Fix Windows systray icon regression (#4704)
This fixes a regression introduced in commit d58d4ba where the systray
icon no longer defaults to the application icon when no custom icon is
provided.
The issue was that the default icon loading was changed from:
defaultIcon := w32.LoadIconWithResourceID(w32.GetModuleHandle(""), w32.RT_ICON)
To:
defaultIcon := getNativeApplication().windowClass.Icon
This caused the systray to display the default Wails icon instead of
the application's custom icon.
The fix reverts the default icon loading back to using
w32.LoadIconWithResourceID with w32.RT_ICON, which correctly loads
the application's icon resource.
Fixes: #4704
* Update changelog for systray icon fix
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Add strong event typings
* Make `EmitEvent` take one data argument only
* Add event registration logic
* Report event cancellation to the emitter
* Prevent registration of system events
* Add support for typed event data initialisation
* Binding generation for events
* Tests for event bindings
* Add vite plugin for typed events
* Fix dev command execution order
Co-authored-by: Fabio Massaioli <fabio.massaioli@gmail.com>
* Propagate module path to templates
* Update templates
Co-authored-by: Ian VanSchooten <ian.vanschooten@gmail.com>
* Go mod tidy for examples
* Switch to tsconfig.json for jetbrains IDE support
* Replace jsconfig in example
* Convert vite plugin to typescript
* Downgrade vite for now
The templates all use 5.x
* Remove root plugins dir from npm files
It's now '/dist/plugins'
* Include types for Create
But keep out of the docs
* Assign a type for cancelAll results
* Restore variadic argument in EmitEvent methods
* Support registered events with void data
* Test cases for void alias support
* Support strict mode
* Support custom event hooks
* Update docs
* Update changelog
* Testdata for typed events
* Test data for void alias support
* fix webview_window emit event
* Update changelog.mdx
* Update events
* Fix generator test path normalization for cross-platform compatibility
The generator tests were failing on CI because they compared absolute file paths
in warning messages. These paths differ between development machines and CI environments.
Changes:
- Normalize file paths in warnings to be relative to testcases/ directory
- Handle both Unix and Windows path separators
- Use Unix line endings consistently in test output
- Update all test expectation files to use normalized paths
This ensures tests pass consistently across different environments including
Windows, macOS, Linux, and CI systems.
* Remove stale comment
* Handle errors returned from validation
* Restore variadic argument to Emit (fix bad rebase)
* Event emitters return a boolean
* Don't use `EmitEvent` in docs
Supposedly it's for internal use, according to comment
* Fix event docs (from rebase)
* Ensure all templates specify @wailsio/runtime: "latest"
* Fix Windows test failure due to CRLF line endings
The test was failing on Windows because:
1. Hardcoded "\n" was being used instead of render.Newline when writing
warning logs, causing CRLF vs LF mismatch
2. The render package import was missing
3. .got.log files weren't being skipped when building expected file list
Changes:
- Add render package import
- Use render.Newline instead of hardcoded "\n" for cross-platform compatibility
- Skip .got.log files in test file walker
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix template tests by using local runtime package
The template tests were failing because they were installing @wailsio/runtime@latest from npm, which doesn't have the new vite plugin yet. This change packs the local runtime and uses it in template tests instead.
Changes:
- Pack the runtime to a tarball in test_js job
- Upload the runtime package as an artifact
- Download and install the local runtime in template tests before building
- Update cleanup job to delete the runtime package artifact
* Apply suggestion from @leaanthony
* Fix: Install local runtime in frontend directory with correct path
The previous fix wasn't working because:
1. npm install was run in the project root, not in frontend/
2. wails3 build runs npm install again, which would reinstall from npm
Fixed by:
- Using npm pkg set to modify package.json to use file:// protocol
- This ensures subsequent npm install calls use the local tarball
* Fix Vue template syntax conflicts with Go template delimiters
The Vue templates were converted to .tmpl files to support dynamic module
paths, but Vue's template syntax {{ }} conflicts with Go's template syntax.
Fixed by escaping Vue template braces:
- {{ becomes {{"{{"}}
- }} becomes {{"}}"}}
This allows the Go template engine to output the literal {{ }} for Vue to process.
* Fix Vue template escaping and Windows shell compatibility
Two issues fixed:
1. Vue template escaping: Changed from {{"{{"}} to {{ "{{" }}
- The previous syntax caused "missing value for command" error
- Correct Go template syntax uses spaces between delimiters and strings
2. Windows PowerShell compatibility: Added 'shell: bash' to template generation step
- The bash syntax (ls, head, $()) doesn't work in PowerShell
- Git Bash is available on all GitHub runners including Windows
* Fix: test_templates depends on test_js for runtime package artifact
The runtime-package artifact is created in test_js job, not test_go.
Added test_js to the needs array so the artifact is available for download.
* Fix Windows path compatibility for runtime package artifact
Changed from absolute Unix path '/tmp/wails-runtime' to relative path
'wails-runtime-temp' which works cross-platform. Using realpath to
convert to absolute path for file:// URL in npm pkg set command.
* Fix realpath issue on Windows for runtime package
realpath on Windows Git Bash was producing malformed paths with duplicate
drive letters (D:\d\a\...). Replaced with portable solution using pwd
that works correctly across all platforms.
* Use pwd -W on Windows to get native Windows paths
Git Bash's pwd returns Unix-style paths (/d/a/wails/wails) which npm
then incorrectly resolves as D:/d/a/wails/wails. Using pwd -W returns
native Windows paths (D:\a\wails\wails) that npm can handle correctly.
This is the root cause of all the Windows path issues.
* Improve typechecking for Events.Emit()
* [docs] Clarify where `Events` is imported from in each example
* Add docs for runtime Events.Emit()
* Revert to v2-style Events.Emit (name, data)
* Update changelog
---------
Co-authored-by: Fabio Massaioli <fabio.massaioli@gmail.com>
Co-authored-by: Atterpac <Capretta.Michael@gmail.com>
Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
* convert file to use lf line-endings
* fileexplorer fix opening dir on Linux
* include update in unreleased changelog
---------
Co-authored-by: Angus Dippenaar <angusdippenaar@gmail.com>
* Fix Windows build error with go-webview2 v1.0.22
Fixes#4513
The go-webview2 library changed the MessageCallback signature in v1.0.22
from `func(string)` to `func(message string, sender *ICoreWebView2, args *ICoreWebView2WebMessageReceivedEventArgs)`.
This caused a build error for users:
```
cannot use w.processMessage (value of type func(message string)) as
func(message string, sender *ICoreWebView2, args *ICoreWebView2WebMessageReceivedEventArgs)
value in assignment
```
Changes:
- Updated processMessage signature to match go-webview2 v1.0.22
- Upgraded go-webview2 dependency from v1.0.21 to v1.0.22
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix Windows build error with go-webview2 v1.0.22
Fixes#4513
The go-webview2 library changed the MessageCallback signature in v1.0.22
from `func(string)` to `func(message string, sender *ICoreWebView2, args *ICoreWebView2WebMessageReceivedEventArgs)`.
This caused a build error for users:
```
cannot use w.processMessage (value of type func(message string)) as
func(message string, sender *ICoreWebView2, args *ICoreWebView2WebMessageReceivedEventArgs)
value in assignment
```
Changes:
- Updated processMessage signature to match go-webview2 v1.0.22
- Upgraded go-webview2 dependency from v1.0.21 to v1.0.22
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* fix: Move HandlePlatformFileDrop to window._wails internal API
Fixes#4489
## Problem
The npm package @wailsio/runtime doesn't work for drag-and-drop because
Go backend calls window.wails.Window.HandlePlatformFileDrop(), but the
npm package doesn't populate window.wails (by design for encapsulation).
## Root Cause
PR #3295 (March 2024) intentionally removed window.wails assignment from
the npm package to improve encapsulation. However, this broke platform
handlers that Go backend relies on.
## Solution
Move HandlePlatformFileDrop from public API (window.wails) to internal
API (window._wails), following the existing pattern:
- window._wails.invoke
- window._wails.environment
- window._wails.flags
## Changes
- Register handlePlatformFileDrop in window._wails namespace
- Update Go backend to call window._wails.handlePlatformFileDrop()
- Use camelCase naming for consistency with other internal API methods
- Rebuild bundled runtime with changes
## Benefits
✅ npm package works without window.wails pollution
✅ Maintains encapsulation of public API
✅ Platform handlers clearly separated as internal
✅ Follows existing internal API conventions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: Add changelog entry for drag-and-drop fix
Updates UNRELEASED_CHANGELOG.md with the fix for #4489.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* fix: prevent white window flash when Hidden option is true
Fixes#4611
When creating a window with Hidden: true, the window was briefly
visible as a white window before disappearing. This was caused by
CreateWindowEx using WS_OVERLAPPEDWINDOW style which includes
WS_VISIBLE by default.
The fix excludes WS_VISIBLE from the window style when the Hidden
option is set to true, ensuring the window remains invisible until
explicitly shown via window.Show().
* Update Changelog
* Fixed Wayland related window maximum size issues on ultrawide monitors by adding a monitor-window search fallback.
* Fixed Wayland related window maximum size issues on ultrawide monitors by adding a monitor-window search fallback.
* Added note to UNRELEASED_CHANGELOG.md regarding Wayland ultrawide monitor fix of issue 4439.
---------
Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
* feat: Binds window menu to app windows
* chore: disables tab feature & controls from menu by default
* docs: Adds title to example for it to show in the window menu item
* style: removes redundant SetBackgroundColor call
* chore: rolls back disabling tab controls for a future optional config
* docs: adds change description to unreleased notes
---------
Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
* fix: compilation issue when using react+next application
When building with next, I got an error during the "collecting page data" step.
Cannot find module '/home/node/application/node_modules/@wailsio/runtime/dist/utils' imported from /home/node/application/node_modules/@wailsio/runtime/dist/contextmenu.js] {
code: 'ERR_MODULE_NOT_FOUND',
* doc: added fix in the changelog
* fix: updated UNRELEASED_CHANGELOG.md
* doc: follow naming convention
* Remove v2 changelog entry
---------
Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
* Check for empty buffers instead of nil in responsewriter
Use Case:
I am using a service that implements `http.Handler` to send streaming
video to the frontend. Reliably, when sending fragmented MP4 data on
MacOS, the app would panic because the buffer being sent through the
response passed a not-nil check but would panic when accessing the first
byte of the buffer.
This PR addresses that by checking if the buffer is not empty instead of
nil, accounting for the case where len(buf) == 0 and cap(buf) > 0, or
maybe where buf[0] == '\0' (I'm not sure how the nil checks work for
slices)
* Update UNRELEASED_CHANGELOG
* Update v3/internal/assetserver/webview/responsewriter_darwin.go
nil and len check
---------
Co-authored-by: Atterpac <89053530+atterpac@users.noreply.github.com>
* fix(macOS): Use visibleFrame for window centering to exclude menu bar
The windowCenter() function was using [screen frame] which includes
the menu bar and dock areas, causing windows to appear positioned
too high on the screen when centered.
This change uses [screen visibleFrame] instead, which excludes the
menu bar and dock areas, resulting in proper visual centering.
Fixes vertical centering issue on macOS in Wails v3 alpha.
* Update v3/UNRELEASED_CHANGELOG.md
* Update changelog entry format
---------
Co-authored-by: Atterpac <89053530+atterpac@users.noreply.github.com>
Co-authored-by: Lea Anthony <lea.anthony@gmail.com>