Commit graph

5,387 commits

Author SHA1 Message Date
Lea Anthony
df2175b950 fix(docker): add BuildKit syntax directive for heredoc support
The Dockerfiles use heredoc syntax which requires BuildKit's
dockerfile:1 syntax directive to parse correctly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:48:41 +11:00
Lea Anthony
403be215a2 feat(ci): add cross-compile test workflow for v3 PRs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:45:13 +11:00
Lea Anthony
cf42f57592 ci: add registry caching for faster Docker builds
Adds registry-based cache alongside GHA cache to improve build times
when GHA cache is evicted (7-day retention limit).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 08:50:48 +11:00
Lea Anthony
9742aec9af ci: add linux/amd64 to cross-compile tests
Always use linux:build:docker for Linux targets to properly test
the Docker image for both amd64 and arm64 architectures.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 08:41:53 +11:00
drc5521
679e4843d2
Update 03-notes-vanilla.mdx (#4917)
* Update 03-notes-vanilla.mdx

The API has been hanged.
application.SaveFileDialog() -> application.Get().Dialog.SaveFile()
application.OpenFileDialog() -> application.Get().Dialog.OpenFile()
application.InfoDialog() -> application.Get().Dialog.Info()

Please refer to the document.
https://v3alpha.wails.io/reference/dialogs/

* Update docs/src/content/docs/tutorials/03-notes-vanilla.mdx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-01-29 06:04:45 +11:00
Lea Anthony
ec78af1fee ci: remove darwin/amd64 from cross-compile tests
Intel Macs are EOL (last released 2020, support ending ~2027).
Focus testing on darwin/arm64 which is the current/future platform.
The Dockerfile still supports amd64 if needed.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:59:15 +11:00
Lea Anthony
c8b4d8534b ci: pull correct platform variant for Docker image
The task uses --platform flag which requires the matching architecture
variant. Pull arm64 variant explicitly for Linux arm64 test.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:38:07 +11:00
Lea Anthony
bc13f7377a ci: force Docker build for Linux arm64 cross-compilation
The linux:build task chooses native build when gcc is available,
but native x86_64 gcc can't cross-compile to arm64 (assembly errors).
Explicitly call linux:build:docker for Linux arm64 target.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:30:09 +11:00
Lea Anthony
c8fc68a66b ci: pull and tag Docker image as 'wails-cross' for task system
The wails3 task system expects a locally tagged 'wails-cross' image.
Pull from ghcr.io and tag it appropriately before running tasks.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:23:15 +11:00
Lea Anthony
2f534f0a5e ci: fix conflicting replace directive in test project
wails3 init already adds a replace directive with relative path.
Use sed to update it to absolute path instead of adding a duplicate.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:18:23 +11:00
Lea Anthony
282854a964 ci: add amd64 cross-compile tests for darwin and windows
Tests 5 cross-compilation targets from Linux/amd64 runner:
- darwin/amd64, darwin/arm64 (cross-platform)
- windows/amd64, windows/arm64 (cross-platform)
- linux/arm64 (cross-architecture)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:17:40 +11:00
Lea Anthony
65b1b838f2 ci: use wails3 task system for cross-compile tests
- Use `wails3 task {os}:build` instead of manual Docker commands
- Test actual cross-compilation only (skip host-to-host):
  - darwin/arm64 from Linux/amd64
  - windows/arm64 from Linux/amd64
  - linux/arm64 from Linux/amd64
- Let task system handle frontend build, bindings, etc.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:10:27 +11:00
Lea Anthony
7bbfc52ca7 ci: generate bindings before frontend build
The frontend build requires Go bindings to be generated first.
Run `wails3 generate bindings` on the host before building frontend.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:07:15 +11:00
Lea Anthony
39e5d47477 ci: install Linux dev dependencies for wails3 CLI build
The wails3 CLI requires GTK3/WebKit2GTK dev packages to build on
the GitHub runner (for CGO).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 08:58:43 +11:00
Lea Anthony
7b7c27271d ci: simplify cross-compile tests to 3 parallel platform jobs
- Use 3 parallel jobs (darwin, linux, windows) instead of 6
- Each job builds both amd64 and arm64 architectures
- Use real wails3 projects via `wails3 init` instead of fake test programs
- Remove pointless non-CGO tests
- Keep library dependency verification for Linux binaries

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 08:55:37 +11:00
Lea Anthony
6592db81cb ci: add cross-compiler image build workflow
Adds workflow to build and test the wails-cross Docker image:
- Builds multi-arch image (amd64/arm64)
- Tests cross-compilation for all 6 platform/arch combinations
- Tests both CGO and non-CGO builds
- Verifies Linux binary library dependencies with readelf
- Publishes to ghcr.io/wailsapp/wails-cross

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 08:37:45 +11:00
Lea Anthony
70c969bf3b feat(build): use GCC for Linux cross-compilation
- Switch from Alpine to Debian (golang:1.25-bookworm)
- Install GTK3/GTK4 and WebKit2GTK 4.1/6.0 dev packages
- Use native GCC for Linux targets instead of Zig
- Add --platform flag to Docker run for architecture matching
- Remove unused zcc-linux-* wrappers (Zig had glibc header issues)
- Keep Zig for Darwin (macOS SDK) and Windows (bundled mingw)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 08:36:45 +11:00
Lea Anthony
f91b8cfeb1 feat: support ARM64 hosts in cross-compiler Docker image
Add TARGETARCH detection to download the correct Zig binary for
the host architecture (aarch64 vs x86_64). This enables native
performance on Apple Silicon Macs instead of requiring emulation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 06:32:47 +11:00
github-actions[bot]
279eea9799 chore(v3): bump to v3.0.0-alpha.64 and update changelog [skip ci] v3.0.0-alpha.64 2026-01-26 02:56:39 +00:00
GitHub Actions
a23c3c4e87 [skip ci] Publish @wailsio/runtime v3.0.0-alpha.79 2026-01-25 03:34:50 +00:00
Lea Anthony
9a363d7be5
feat(v3): add server mode for headless HTTP deployment (#4903)
* feat(v3): add server mode for headless HTTP deployment

Server mode allows Wails applications to run as pure HTTP servers
without native GUI dependencies. Enable with `-tags server` build tag.

Features:
- HTTP server with configurable host/port via ServerOptions
- WAILS_SERVER_HOST and WAILS_SERVER_PORT env var overrides
- WebSocket event broadcasting to connected browsers
- Browser clients represented as BrowserWindow (Window interface)
- Health check endpoint at /health
- Graceful shutdown with configurable timeout
- Docker support with Dockerfile.server template and tasks

Build and run:
  wails3 task build:server
  wails3 task run:server
  wails3 task build:docker
  wails3 task run:docker

Documentation at docs/guides/server-build.mdx

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat(v3): add server mode for headless HTTP deployment

Server mode allows Wails applications to run as pure HTTP servers
without native GUI dependencies. Enable with `-tags server` build tag.

Features:
- HTTP server with configurable host/port via ServerOptions
- WAILS_SERVER_HOST and WAILS_SERVER_PORT env var overrides
- WebSocket event broadcasting to connected browsers
- Browser clients represented as BrowserWindow (Window interface)
- Health check endpoint at /health
- Graceful shutdown with configurable timeout
- Docker support with Dockerfile.server template and tasks

Build and run:
  wails3 task build:server
  wails3 task run:server
  wails3 task build:docker
  wails3 task run:docker

Documentation at docs/guides/server-build.mdx

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: address CodeRabbit review comments

- Fix corrupted test file with embedded terminal output
- Fix module name mismatch in gin-routing (was gin-example)
- Fix replace directive version mismatch in gin-service
- Fix placeholder module name in ios example (was changeme)
- Fix Dockerfile COPY path to work from both build contexts
- Fix bare URL in README (MD034 compliance)
- Fix comment accuracy in getScreens (returns error, not empty slice)
- Remove deprecated docker-compose version field
- Add port documentation in Taskfile template

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: address CodeRabbit review comments

- Add note about healthcheck wget not being available in distroless images
- Add !server build constraint to menu_windows.go and menu_darwin.go
- Downgrade window-visibility-test go.mod from 1.25 to 1.24 to match CI

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 14:33:44 +11:00
github-actions[bot]
103ff347e0 chore(v3): bump to v3.0.0-alpha.63 and update changelog [skip ci] v3.0.0-alpha.63 2026-01-25 02:55:49 +00:00
Lea Anthony
537c74327d
fix(darwin): make Position() and SetPosition() use consistent coordinate systems (#4818)
* fix(darwin): make Position() and SetPosition() use consistent coordinate systems

On macOS, windowGetPosition() was returning raw Cocoa coordinates (Y=0 at
bottom of screen) while windowSetPosition() expected coordinates with Y=0
at the top of the screen. This caused window positions to drift when saving
and restoring window state across application sessions.

The fix updates windowGetPosition() to:
1. Convert Y coordinates to top-origin (matching windowSetPosition)
2. Apply DPI scale factor (matching windowSetPosition)

This ensures Position() returns values that can be directly passed back to
SetPosition() for consistent round-trip behavior.

Fixes #4816

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(darwin): make Position() and SetPosition() use consistent coordinate systems

On macOS, windowGetPosition() was returning raw Cocoa coordinates (Y=0 at
bottom of screen) while windowSetPosition() expected coordinates with Y=0
at the top of the screen. This caused window positions to drift when saving
and restoring window state across application sessions.

The fix updates windowGetPosition() to:
1. Convert Y coordinates to top-origin (matching windowSetPosition)
2. Apply DPI scale factor (matching windowSetPosition)

This ensures Position() returns values that can be directly passed back to
SetPosition() for consistent round-trip behavior.

Fixes #4816

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-25 12:40:25 +11:00
github-actions[bot]
9a131a049d chore(v3): bump to v3.0.0-alpha.62 and update changelog [skip ci] v3.0.0-alpha.62 2026-01-22 02:51:17 +00:00
Lea Anthony
8d28e2d06b
fix(windows): skip DPI awareness API call when already set via manifest (#4811)
Check current DPI awareness before calling SetProcessDpiAwarenessContext.
Windows only allows setting DPI awareness once per process - either via
manifest or API, not both. If already set (e.g., via application manifest
in built binaries), skip the API call to avoid "Access is denied" errors.

Fixes #4803

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-21 19:23:56 +11:00
github-actions[bot]
a0d2e03f64 chore(v3): bump to v3.0.0-alpha.61 and update changelog [skip ci] v3.0.0-alpha.61 2026-01-20 02:48:15 +00:00
Ndianabasi Udonkang
8598034942
Change Window Type from WebviewWindow to Window (#4829)
* fix: change window type from WebviewWindow to Window

* docs: update `UNRELEASED_CHANGELOG`

---------

Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
2026-01-20 10:42:54 +11:00
Abdelhadi Seddar
9158c49e30
docs: fixed incorrect tag in Custom Output Directory of Bindings (#4873)
* docs: fixed incorrect tag in Custom Output Directory of Bindings

After some usage of wails I found out that

```bash
wails3 generate bindings -o ./src/bindings
``` 
does not work and according to 
```bash
$ wails3 generate bindings --help 
```
it uses the `-d string` tag instead

* Update UNRELEASED_CHANGELOG.md

---------

Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
2026-01-20 10:41:46 +11:00
github-actions[bot]
d7d6720d54 chore(v3): bump to v3.0.0-alpha.60 and update changelog [skip ci] v3.0.0-alpha.60 2026-01-14 02:50:25 +00:00
Zach Botterman
37fb9b9ba5
fix(v3/linux): Fix menu update by clearing menu (#4875)
* clear menu

* update changelog

* free list

* register glistfree
2026-01-13 21:42:09 +11:00
github-actions[bot]
9db2f74c44 chore(v3): bump to v3.0.0-alpha.59 and update changelog [skip ci] v3.0.0-alpha.59 2026-01-11 02:54:04 +00:00
Ndianabasi Udonkang
897479d52b
Enhance Drag-N-Drop README with Internal Drag and Drop Info (#4869)
* Enhance README with internal drag and drop info

Added details about internal drag and drop functionality.

* Update UNRELEASED_CHANGE.md
2026-01-10 20:00:52 +11:00
github-actions[bot]
be0e9bab9b chore(v3): bump to v3.0.0-alpha.58 and update changelog [skip ci] v3.0.0-alpha.58 2026-01-09 02:46:28 +00:00
Lea Anthony
0abad1ffb2
fix(v3/linux): fix crash on panic in JS-bound Go methods (#4856)
* fix(v3/linux): fix crash on panic in JS-bound Go methods

WebKit2GTK installs signal handlers after gtk_main() starts, overriding
our SA_ONSTACK fix. This causes Go panics (e.g., nil pointer dereference)
in JS-bound methods to crash with 'non-Go code set up signal handler
without SA_ONSTACK flag'.

Fix by deferring signal handler installation via g_idle_add() to run
after GTK main loop starts, ensuring we fix handlers AFTER WebKit
has installed its own.

Fixes #3965

* test(v3/linux): add test case for signal handler fix

Adds a test application that can trigger panics from JS-bound Go methods
to verify the signal handler fix for issue #3965 works correctly.

The test app has buttons to:
- Trigger a panic in a goroutine
- Trigger an immediate panic
- Call a safe method

Before the fix, clicking 'Trigger Panic' would crash the app.
After the fix, panics are recovered and logged.

* chore: remove test case from PR

* fix(linux): call signal handler fix after WebKit init, not in idle callback

Move install_signal_handlers() call to after webkit_web_view_new_with_user_content_manager()
to ensure WebKit has finished setting up its signal handlers before we add SA_ONSTACK.

The previous g_idle_add approach was still too early - WebKit initialization continues
after GTK init. This matches the v2 approach which waits for actual webview creation.

Also add documentation about the known Go limitation (golang/go#7227) where signals
may still be delivered on the wrong stack in some C interop scenarios.
2026-01-08 21:20:13 +11:00
Lea Anthony
1fb60abdc9
docs(v3): update API references to new Manager API pattern (#4863)
* docs(v3): update API references to new Manager API pattern

Update documentation to reflect the Manager API refactoring from alpha.10:

Window API:
- app.NewWebviewWindow() -> app.Window.New()
- app.NewWebviewWindowWithOptions() -> app.Window.NewWithOptions()
- app.CurrentWindow() -> app.Window.Current()
- app.GetAllWindows() -> app.Window.GetAll()
- app.WindowByName() -> app.Window.GetByName()

Event API:
- app.EmitEvent() -> app.Event.Emit()
- app.OnEvent() -> app.Event.On()
- app.OnApplicationEvent() -> app.Event.OnApplicationEvent()

Dialog API:
- app.OpenFileDialog() -> app.Dialog.OpenFile()
- app.SaveFileDialog() -> app.Dialog.SaveFile()
- app.InfoDialog() -> app.Dialog.Info()
- app.ErrorDialog() -> app.Dialog.Error()
- app.WarningDialog() -> app.Dialog.Warning()
- app.QuestionDialog() -> app.Dialog.Question()

Other APIs:
- app.NewSystemTray() -> app.SystemTray.New()
- app.SetApplicationMenu() -> app.Menu.Set()
- app.GetPrimaryScreen() -> app.Screen.GetPrimary()
- app.GetAllScreens() -> app.Screen.GetAll()
- app.ClipboardGetText() -> app.Clipboard.Text()
- app.ClipboardSetText() -> app.Clipboard.SetText()
- app.BrowserOpenURL() -> app.Browser.OpenURL()

Fixes outdated code examples across 31 documentation files.

* chore(v3): add docs fix to unreleased changelog
2026-01-08 21:16:45 +11:00
github-actions[bot]
862e2e8d6c chore(v3): bump to v3.0.0-alpha.57 and update changelog [skip ci] v3.0.0-alpha.57 2026-01-05 02:55:08 +00:00
mbaklor
93c307b4b2
V3/fix debug logs (#4857)
* fix(v3): replace various debug logs from Info to Debug

* fix(v3): fixed logging on linux as well as windows

* fix(v3): add format directive for warning log argument

---------

Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
2026-01-05 08:48:29 +11:00
Lea Anthony
4dce80d887
fix(v3): revert goccy/go-json to stdlib encoding/json to fix Windows panic (#4859)
* fix(v3): warm up dialog types in go-json cache to prevent Windows panic

Add FileFilter, OpenFileDialogOptions, SaveFileDialogOptions, and
MessageDialogOptions to the init() warmup to prevent index out of bounds
panic on Windows when these types are first unmarshaled.

Fixes goccy/go-json#474 for Wails internal dialog types.

* fix(v3): revert goccy/go-json to stdlib encoding/json to fix Windows panic

goccy/go-json has a type address calculation bug on Windows that causes
index out of bounds panic when decoding user-defined types for the first time.

This reverts all runtime usages of goccy/go-json back to stdlib encoding/json.
Test and benchmark files are left unchanged.

Partially reverts PR #4843.
2026-01-05 08:26:35 +11:00
Lea Anthony
23b3424415
fix(v3): use correct JSON field names for drop coordinates in example (#4858)
* fix(v3): use correct JSON field names for drop coordinates in example

The DropTargetDetails struct uses lowercase JSON tags (x, y), but the
example frontend was accessing uppercase (X, Y).

* docs(v3): add coordinates fix to changelog
2026-01-05 06:51:41 +11:00
Lea Anthony
ee7e95af52
fix(v3): fix macOS mkdir brace expansion when APP_NAME contains spaces (#4850)
fix(v3): fix macOS mkdir when APP_NAME contains spaces

Replace brace expansion {MacOS,Resources} with two separate mkdir commands.
Brace expansion doesn't work inside quoted strings and is shell-dependent.

Adds integration test to verify mkdir works with spaces in paths.
2026-01-04 15:48:03 +11:00
samstanier
9039051fd3
[v3] Fix save dialog filename not pre-populated on Linux (#4841) (#4842)
The SaveFileDialog.SetFilename() option had no effect on Linux because
the filename was never passed to the GTK file chooser.

This adds a currentName parameter to runChooserDialog and calls
gtk_file_chooser_set_current_name() for save dialogs when a filename
is specified.

Changes:
- linux_cgo.go: Add currentName parameter and GTK call
- linux_purego.go: Add gtkFileChooserSetCurrentName binding and same fix

Fixes the Linux implementation to match the behaviour on Windows and macOS.

Co-authored-by: sas229 <sas229@cam.ac.uk>
Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
2026-01-04 14:40:10 +11:00
github-actions[bot]
a1dd1f4d19 chore(v3): bump to v3.0.0-alpha.56 and update changelog [skip ci] v3.0.0-alpha.56 2026-01-04 02:54:09 +00:00
Lea Anthony
d0aa2a6e1f
fix(docs): escape MDX special characters in changelog and linux guide (#4849)
- Wrap `<=8` in backticks in changelog.mdx to prevent MDX interpreting
  `<` as JSX element start
- Remove unsupported {#custom-id} syntax from heading in linux.mdx as
  Starlight/Astro auto-generates heading IDs

This fixes the docs build failure in the Deploy to GitHub Pages workflow.
2026-01-04 13:35:28 +11:00
Lea Anthony
f1a4ffe72d
feat(linux): add libpath package for finding native library paths (#4847)
* feat(linux): add libpath package for finding native library paths

Add a new internal/libpath package that locates shared libraries (.so files)
on Linux systems. Supports multiple distributions and package managers.

Features:
- Multi-tier search: pkg-config -> ldconfig -> filesystem scanning
- Parallel search using goroutines for faster lookups
- Cached dynamic path discovery for Flatpak, Snap, and Nix
- Support for Debian/Ubuntu, Fedora/RHEL, Arch, openSUSE, NixOS
- Context-aware cancellation for graceful shutdown

Performance:
- Library found: ~1.4ms (parallel search)
- Library not found: ~46ms (was 84ms sequential)
- Cached path discovery: 14ns (was 15ms uncached)

* feat(libpath): add multi-library parallel search functions

Add functions to search for multiple library candidates in parallel:

- FindFirstLibrary: Search multiple libs in parallel, return first found
- FindFirstLibraryOrdered: Search in order of preference (for version priority)
- FindAllLibraries: Find all available libraries from a list

Useful when the exact library version is unknown, e.g.:
  match, _ := FindFirstLibrary("webkit2gtk-4.1", "webkit2gtk-4.0", "webkit2gtk-6.0")

Also adds findLibraryPathCtx for context-aware searching used by the
multi-library functions.

* refactor(libpath): split into separate files and fix race condition

Split libpath_linux.go into smaller, focused files:
- cache_linux.go: Path cache with thread-safe init/invalidate
- flatpak_linux.go: Flatpak runtime path discovery
- snap_linux.go: Snap package path discovery
- nix_linux.go: Nix/NixOS path discovery
- libpath_linux.go: Core search functions

Fixes:
- Fix data race between init() and invalidate() by holding mutex
  during cache writes inside sync.Once.Do (CodeRabbit review)
- Fix FindLibraryPathWithOptions not searching dynamic paths
  (Flatpak/Snap/Nix) - now uses GetAllLibPaths() (CodeRabbit review)
2026-01-04 11:59:22 +11:00
GitHub Actions
722717a11e [skip ci] Publish @wailsio/runtime v3.0.0-alpha.78 2026-01-04 00:09:35 +00:00
Lea Anthony
53c2275fea
fix(v3): overhaul drag-and-drop for Linux reliability and simplify Windows implementation (#4848)
* fix(v3): overhaul drag-and-drop for Linux reliability and simplify Windows

This commit fixes drag-and-drop reliability on Linux and simplifies the
Windows implementation.

## Linux
- Rewrite GTK drag handlers to properly intercept external file drops
- Fix HTML5 internal drag-and-drop being broken when file drop enabled
- Add hover effects during file drag operations
- Fix multiple app instances interfering with each other

## Windows
- Remove native IDropTarget in favor of JavaScript approach (matches v2)
- File drops now handled via chrome.webview.postMessageWithAdditionalObjects

## All Platforms
- Rename EnableDragAndDrop to EnableFileDrop
- Rename data-wails-drop-target to data-file-drop-target
- Rename wails-drop-target-active to file-drop-target-active
- Add comprehensive drag-and-drop documentation

## Breaking Changes
- EnableDragAndDrop -> EnableFileDrop
- data-wails-dropzone -> data-file-drop-target
- wails-dropzone-hover -> file-drop-target-active
- DropZoneDetails -> DropTargetDetails
- Remove WindowDropZoneFilesDropped event (use WindowFilesDropped)

* feat(macos): optimize drag event performance with debouncing and caching

- Add 50ms debouncing to limit drag events to 20/sec (was 120/sec)
- Implement window implementation caching to avoid repeated lookups
- Maintain existing 5-pixel threshold for immediate response
- Keep zero-allocation path with pre-allocated buffers
- Rename linuxDragActive to nativeDragActive for clarity
- Update IMPLEMENTATION.md with optimization details and Windows guidance

Performance improvements:
- 83% reduction in event frequency
- ~6x reduction in CPU/memory usage during drag operations
- Maintains smooth visual feedback with InvokeSync for timer callbacks

* fix(windows): implement proper file drop support for Windows

- Remove incorrect AllowExternalDrag(false) call that was blocking file drops
- Fix message prefix from 'FilesDropped' to 'file:drop:' to match JS runtime
- Fix coordinate parsing for 'file:drop:x:y' format (indices 2,3 not 1,2)
- Add enableFileDrop flag injection to JS runtime during navigation
- Update JS runtime to check enableFileDrop flag before processing drops
- Always call preventDefault() to stop browser navigation on file drags
- Show 'no drop' cursor when file drops are disabled
- Update example to filter file drags from HTML drop zone handlers
- Add documentation for combining file drop with HTML drag-and-drop

* fix(v3): block file drops on Linux when EnableFileDrop is false

- Add disableDND() to intercept and reject external file drags at GTK level
- Show 'no drop' cursor when files are dragged over window
- Allow internal HTML5 drag-and-drop to work normally
- Initialize _wails.flags object in runtime core to prevent undefined errors
- Inject enableFileDrop flag on Linux and macOS (matching Windows)
- Fix bare _wails reference to use window._wails
- Update docs with info about blocked drops and combining with HTML DnD

* fix(darwin): add missing fmt import in webview_window_darwin.go

* fix(macOS): implement hover effects for file drag-and-drop with optimizations

- Added draggingUpdated: handler to track mouse movement during drag operations
- Implemented macosOnDragEnter/Exit/Over export functions for real-time hover state
- Fixed JS function call from '_wails.handlePlatformFileDrop' to correct 'wails.Window.HandlePlatformFileDrop'
- Added EnableFileDrop flag checks to prevent hover effects when file drops are disabled
- Renamed linuxDragActive to nativeDragActive for cross-platform consistency

Performance optimizations:
- Added 50ms debounce to reduce event frequency from ~120/sec to ~20/sec
- Implemented 5-pixel movement threshold for immediate response
- Added window caching with sync.Map to avoid repeated lookups
- Zero-allocation JavaScript calls with pre-allocated 128-byte buffer
- Reduced memory usage to ~18 bytes per event (6x reduction)

Build improvements:
- Updated runtime Taskfile to include documentation generation
- Added docs:build task to runtime build process
- Fixed build order: events → docs → runtime

Documentation:
- Added IMPLEMENTATION.md with optimization details
- Included guidance for Windows implementation

* chore(v3/examples): remove html-dnd-api example

The drag-n-drop example now demonstrates both external file drops
and internal HTML5 drag-and-drop, making this separate example redundant.

* docs(v3): move drag-and-drop implementation details to runtime-internals

- Add drag-and-drop section to contributing/runtime-internals.mdx
- Remove IMPLEMENTATION.md from example (content now in proper docs)
- Covers platform differences, debugging tips, and key files

* fix(v3): remove html-dnd-api from example build list

* fix(v3): remove duplicate json import in application_darwin.go

* fix(v3): address CodeRabbit review feedback

- Fix docs to use app.Window.NewWithOptions() instead of deprecated API
- Add mutex protection to dragOverJSBuffer to prevent race conditions
- Add mutex protection to dragThrottleState fields for thread safety

* docs: add coderabbit pre-push requirement to AGENTS.md

* fix(v3/test): use correct CSS class name file-drop-target-active

* chore(v3/test): remove dnd-test directory

This was a development test file that shouldn't be in the PR.
The drag-n-drop example serves as the proper test case.

* docs(v3): update Windows file drop comment to reflect implemented fix

Remove stale TODO - enableFileDrop flag is now injected in navigationCompleted

* refactor(v3): make handleDragAndDropMessage unexported

Internal method only called by application event loop, not part of public API.
2026-01-04 11:08:29 +11:00
github-actions[bot]
53cd30acc7 chore(v3): bump to v3.0.0-alpha.55 and update changelog [skip ci] v3.0.0-alpha.55 2026-01-02 02:46:35 +00:00
Ndianabasi Udonkang
0b6dfe032c
Improve Build Commands to Accommodate Spaces (#4845)
* fix: improve darwin build commands to accommodate spaces in APP_NAME

* fix: improve android build commands to accommodate spaces in APP_NAME

* fix: improve ios build commands to accommodate spaces in APP_NAME

* fix: improve linux build commands to accommodate spaces in APP_NAME

* fix: improve windows build commands to accommodate spaces in APP_NAME

* docs: update `v3/UNRELEASED_CHANGELOG.md`

* fix(docs): correct changelog

* fix: remove quotes around GO_CACHE_MOUNT and REPLACE_MOUNTS

---------

Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
2026-01-02 00:21:22 +00:00
Lea Anthony
a06d55804c
perf(v3): optimize JSON processing and reduce allocations in hot paths (#4843)
* perf(v3): optimize JSON processing and reduce allocations in hot paths

- Switch to goccy/go-json for method binding, events, and HTTP transport
  (21-63% faster, 40-60% less memory for method calls)
- Optimize BoundMethod struct layout to reduce padding (144 -> 136 bytes)
- Cache isVariadic flag at registration to avoid reflect call per invocation
- Use stack-allocated buffer for method arguments (<=8 args)
- Optimize result collection to avoid slice allocation for single return values
- Use sync.Map for MIME cache to improve concurrent read performance
- Use buffer pool for HTTP transport request body reading
- Lazily allocate CloseNotify channel in content type sniffer
- Remove debug CSS logging from asset server
- Add comprehensive benchmark tests (build tag: bench)

Performance improvements for BoundMethod.Call:
- SimpleCall:   1290ns -> 930ns (28% faster), 240B -> 80B (67% less memory)
- ComplexCall:  10500ns -> 3900ns (63% faster), 1192B -> 1020B (14% less)
- VariadicCall: 3460ns -> 1600ns (54% faster), 512B -> 289B (44% less)

* perf(v3): add max size limit to buffer pool to prevent memory bloat

Buffers larger than 512KB are not returned to the pool, allowing GC
to reclaim memory after large requests (e.g., base64 encoded images).

* perf(v3): remove mimetype library dependency, saving ~208KB binary size

- Replace github.com/wailsapp/mimetype with expanded extension map + stdlib
- Expand MIME type map from 16 to 50+ common web formats (fonts, audio, video, etc.)
- Add comprehensive test suite validating MIME detection for all web formats
- Use http.DetectContentType as fallback for unknown extensions
- Actual binary size reduction: 1.2MB (11MB -> 9.8MB in test app)

* perf(v3): migrate all runtime code to goccy/go-json

Migrate remaining encoding/json usages to goccy/go-json in:
- pkg/application (android, darwin, ios, single_instance, webview_window)
- pkg/services (kvstore, notifications on all platforms)
- internal/assetserver/webview (request/response handling)
- internal/runtime and internal/capabilities

Note: encoding/json (110KB) remains in binary because:
1. goccy/go-json imports it for interface compatibility (json.Marshaler, etc.)
2. log/slog (stdlib) uses it for JSON output

The performance benefit is in the hot paths which now use the faster library.

* perf(v3): replace gopkg.in/ini.v1 with minimal .desktop file parser

Replace the gopkg.in/ini.v1 dependency with a purpose-built minimal parser
for Linux .desktop files.

The new parser:
- Only extracts the Exec key from [Desktop Entry] section (all we need)
- Follows the Desktop Entry Specification
- Has comprehensive test coverage (40 tests) including:
  - All major file managers (Nautilus, Dolphin, Thunar, PCManFM, Caja, Nemo)
  - Edge cases (UTF-8, special chars, comments, empty files, etc.)
  - Buffer limit handling

Binary size reduction: 45KB (10.22MB -> 10.18MB)

* perf(v3): remove samber/lo from runtime code, saving ~310KB binary size

Replace samber/lo with Go 1.21+ stdlib slices package and minimal internal
helpers in all runtime code paths. This removes 80 transitive dependencies
from the production binary.

Changes:
- Create internal/sliceutil package with Unique and FindMapKey helpers
- Replace lo.Without with slices.DeleteFunc in event handling
- Replace lo.Ternary with inline if/else in Windows code
- Replace lo.Uniq with sliceutil.Unique for feature flags
- Replace lo.FindKey with sliceutil.FindMapKey for method aliases
- Replace lo.Filter with slices.DeleteFunc in event listeners
- Replace lo.Must with inline panic in w32 package

Binary size: 10.18MB -> 9.87MB (~310KB / 3% reduction)

Note: CLI tools still use samber/lo since they don't affect
production binary size. The application_debug.go file also
retains lo usage as it has //go:build !production tag.

* fix: address CodeRabbit review comments

- Use application/x-typescript MIME type (not IANA-registered text/typescript)
- Fix potential panic in mimetype_stdlib_test.go for short MIME strings
- Use cached isVariadic flag in bindings_optimized_bench_test.go

* fix: initialize goccy/go-json decoder early to fix Windows test failure

On Windows, goccy/go-json's type address calculation can fail if the
decoder is first invoked during test execution rather than at init time.
Force early initialization by unmarshaling a []int during package init.

See: https://github.com/goccy/go-json/issues/474

* 📝 Add docstrings to `v3/performance-improvements` (#4844)

* fix: initialize goccy/go-json decoder early to fix Windows test failure

On Windows, goccy/go-json's type address calculation can fail if the
decoder is first invoked during test execution rather than at init time.
Force early initialization by unmarshaling a []int during package init.

See: https://github.com/goccy/go-json/issues/474

* 📝 Add docstrings to `v3/performance-improvements`

Docstrings generation was requested by @leaanthony.

* https://github.com/wailsapp/wails/pull/4843#issuecomment-3703472562

The following files were modified:

* `v3/internal/assetserver/common.go`
* `v3/internal/assetserver/content_type_sniffer.go`
* `v3/internal/assetserver/mimecache.go`
* `v3/internal/fileexplorer/desktopfile.go`
* `v3/internal/fileexplorer/fileexplorer_linux.go`
* `v3/internal/sliceutil/sliceutil.go`
* `v3/pkg/application/application_ios.go`
* `v3/pkg/application/bindings.go`
* `v3/pkg/application/ios_runtime_ios.go`
* `v3/pkg/w32/window.go`

---------

Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-01-02 07:03:36 +11:00
github-actions[bot]
3256041d8b chore(v3): bump to v3.0.0-alpha.54 and update changelog [skip ci] v3.0.0-alpha.54 2025-12-29 02:52:26 +00:00