mirror of
https://github.com/wailsapp/wails.git
synced 2026-03-14 14:45:49 +01:00
895 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
78e701fd54 |
feat(v3): Modal windows (macOS) (#4839)
* modal window * thread safety * update docs * windows support --------- Co-authored-by: Lea Anthony <lea.anthony@gmail.com> |
||
|
|
6ad671f34d |
fix (darwin/v3) can't minimise in frameless (#5016)
* fix v3 can't minimise in frameless * update UNRELEASED_CHANGELOG |
||
|
|
8eaed8c5f6 |
fix(linux): remove Screen typedef collision with X11 Xlib.h (#4979)
* fix(linux): remove unused C Screen typedef that collides with X11 Xlib.h The GTK4 backend includes <gdk/x11/gdkx.h> for X11 window positioning, which pulls in <X11/Xlib.h>. Xlib defines its own `Screen` typedef, conflicting with the identically-named struct in linux_cgo_gtk4.h. The C Screen struct was unused - the Go code constructs Go Screen structs directly from GDK monitor data, never referencing C.Screen. Fixes #4957 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * ci: run GTK4 build and tests on all v3-alpha PRs The GTK4 CI steps were gated on github.head_ref == 'feature/webkit-gtk6-support', meaning no other branch ever ran GTK4 compilation checks. This allowed the Screen typedef collision to slip through undetected. Now that GTK4 support has been merged, run GTK4 dependency installation, example builds, and test suite on every PR targeting v3-alpha. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: add GTK4 Screen typedef fix to unreleased changelog Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix changelog * fix changelog * fix(ci): pass BUILD_TAGS through to go build in test:example:linux The GTK4 CI step ran BUILD_TAGS=gtk4 task test:examples but the Taskfile task ignored the env var, always building with no -tags flag. Use shell parameter expansion so BUILD_TAGS flows through to go build. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
1a5c6dceee |
fix(v3): Dock ops sync and add GetBadge method (#4838)
* dock fixes and get method * update changelog * async -> sync * cleanup iOS and darwin set call * handle potential errors |
||
|
|
e999741e9b |
fix(v3/macos): guard InvisibleTitleBarHeight and fix top-corner resize shaking (#4962)
* fix(v3/macos): guard InvisibleTitleBarHeight and fix top-corner resize shaking (#4960) - Only apply InvisibleTitleBarHeight when the native drag area is actually hidden (frameless window or transparent title bar presets like HiddenInset). Previously it was applied unconditionally, which could swallow clicks near the top of standard windows. - Skip drag initiation when the click is near the left/right window edges within the invisible title bar zone. This prevents conflict between dragging and native top-corner resizing, which caused window content to shake/jitter. Fixes #4960 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: update InvisibleTitleBarHeight docs and changelog (#4960) Document that InvisibleTitleBarHeight only applies to frameless or transparent title bar windows, and add changelog entries for the guard and edge-detection fixes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
716507b488 |
fix(linux/gtk4): window position, max size, and show/hide on X11 (#4965)
* fix(linux/gtk4): window position, max size, and show/hide on X11 (#4957) - Use gtk_window_present() in windowShow() to properly restore windows after hide instead of gtk_widget_set_visible() which could leave windows minimized - Add X11-conditional window position get/set using XTranslateCoordinates and XMoveWindow, gated behind GDK_IS_X11_DISPLAY runtime checks and GDK_WINDOWING_X11 compile-time guards. Wayland continues to return 0,0 gracefully since position is not available there. - Implement max window size enforcement via notify::default-width/height signal handlers that clamp dimensions, replacing the removed gtk_window_set_geometry_hints from GTK3 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: treat skipped cross-compile job as success in CI The cross_compile_results job treats "skipped" as a failure, but the cross_compile job is legitimately skipped when the PR hasn't been approved yet. Accept "skipped" alongside "success". Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
59cadb7aa0 | [skip ci] Publish @wailsio/runtime v3.0.0-alpha.80 | ||
|
|
5dc3e21699 |
feat(linux): GTK4 + WebKitGTK 6.0 support (opt-in via -tags gtk4) (#4958)
* chore: add WebKitGTK 6.0/GTK4 epic and beads issue tracking
Initialize beads (bd) issue tracker with comprehensive epic for
WebKitGTK 6.0 / GTK4 support as the new default for Wails v3 Linux.
Epic: wails-webview2gtk6-t4e (40 tasks)
- GTK4/WebKit6 as default (no build tag needed)
- GTK3/WebKit4.1 via -tags gtk3 for legacy
- Docker container with both library sets for cross-compilation
- Comprehensive test strategy including benchmarks
- task build:linux (GTK4) and task build:linux:gtk3 (legacy)
* feat(linux): add WebKitGTK 6.0 / GTK4 support infrastructure [WIP]
Architecture change for modern Linux desktop support:
- GTK4/WebKitGTK 6.0 is the new DEFAULT (no build tag)
- GTK3/WebKit2GTK 4.1 is LEGACY (requires -tags gtk3)
Changes:
- Add gtk3 build constraint to existing GTK3 CGO files
- Create GTK4 stub implementations (linux_cgo_gtk4.go, application_linux_gtk4.go)
- Create WebKitGTK 6.0 asset server stubs (webkit6.go, request/responsewriter)
Known limitations (documented):
- Window positioning is NO-OP on GTK4/Wayland (protocol limitation)
- Menu system needs GMenu/GAction rewrite (stub only)
- Some methods have TODO markers for full implementation
This establishes the build infrastructure for GTK4 support.
Full implementation requires GTK4 dev environment for testing.
* docs: add implementation tracker for WebKitGTK 6.0/GTK4 work
- Create IMPLEMENTATION.md to track progress, decisions, and API differences
- Update AGENTS.md with instructions to maintain IMPLEMENTATION.md
- Document Phase 1 completion and remaining phases
* feat(linux): update doctor and capabilities for GTK4/WebKitGTK 6.0 support
- Update all 7 package managers (apt, dnf, pacman, zypper, emerge, eopkg, nixpkgs)
to check for GTK4/WebKitGTK 6.0 as primary dependencies
- Mark GTK3/WebKit2GTK packages as optional/legacy
- Add GTKVersion and WebKitVersion fields to Capabilities struct
- Create capabilities_linux_gtk3.go for legacy build path
- Update IMPLEMENTATION.md to mark Phase 2 complete
GTK4 packages are now checked by default. Legacy GTK3 packages
are marked optional and only needed when building with -tags gtk3.
* feat(linux): implement GTK4 window management and event handling
- Add GtkEventController-based event handling for GTK4:
- GtkEventControllerFocus for focus in/out
- GtkGestureClick for button press/release
- GtkEventControllerKey for keyboard events
- Implement window drag/resize using GdkToplevel API
- Add complete drag-and-drop support with GtkDropTarget
- Fix window state detection (minimized, maximized, fullscreen)
- Fix size() to properly return window dimensions in GTK4
- Update IMPLEMENTATION.md to mark Phase 3 complete
GTK4 uses a fundamentally different event model with controllers
instead of direct signal handlers. This commit implements all the
necessary event handling for window management.
* feat(linux): implement GTK4 menu system with GMenu/GAction
Phase 4 of WebKitGTK 6.0/GTK4 implementation.
GTK4 completely replaces the menu system. GTK3's GtkMenu/GtkMenuItem
are replaced by:
- GMenu: Menu model (data structure, not a widget)
- GMenuItem: Individual menu item in the model
- GSimpleAction: Action triggered when menu item is activated
- GSimpleActionGroup: Container for actions, attached to widgets
- GtkPopoverMenuBar: Menu bar widget created from GMenu model
Key changes:
- linux_cgo_gtk4.go: Added C helpers and Go functions for GMenu/GAction
- menuActionActivated() callback for action triggers
- menuItemNewWithId/menuCheckItemNewWithId/menuRadioItemNewWithId
- set_action_enabled/set_action_state for state management
- menu_linux_gtk4.go: GTK4 menu processing (processMenu, addMenuItem)
- menuitem_linux_gtk4.go: GTK4 menu item handling and role menus
- menu_linux.go: Added gtk3 build tag
- menuitem_linux.go: Added gtk3 build tag
Deferred to future work:
- Context menus with GtkPopoverMenu
- Keyboard accelerators with GtkShortcut
* feat(linux): add missing CGO exports for GTK4 asset server
Phase 5 of WebKitGTK 6.0/GTK4 implementation.
The GTK4 CGO file was missing two critical exports that existed in the
GTK3 version:
1. onProcessRequest - Handles WebKit URI scheme requests. This callback
is registered with webkit_web_context_register_uri_scheme and routes
asset requests to the webviewRequests channel for processing.
2. sendMessageToBackend - Handles JavaScript to Go communication. This
is called when JavaScript sends messages via the webkit user content
manager, enabling the IPC bridge.
The asset server files (webkit6.go, request_linux_gtk4.go,
responsewriter_linux_gtk4.go) were already complete from Phase 1.
WebKitGTK 6.0 uses the same URI scheme handler API as WebKitGTK 4.1.
* build(linux): add GTK4 support to Docker and Taskfile
Phase 6 of WebKitGTK 6.0/GTK4 implementation.
Docker containers (Ubuntu 24.04):
- Install both GTK4/WebKitGTK 6.0 (default) and GTK3/WebKit2GTK 4.1 (legacy)
- Build scripts support BUILD_TAGS environment variable
- Default build uses GTK4, BUILD_TAGS=gtk3 uses legacy GTK3
Taskfile targets:
- test:example:linux - Build with GTK4 (default)
- test:example:linux:gtk3 - Build with GTK3 (legacy)
- test:examples:linux:docker:x86_64 - Docker build with GTK4
- test:examples:linux:docker:x86_64:gtk3 - Docker build with GTK3
- test:examples:linux:docker:arm64 - Docker build with GTK4 (ARM64)
- test:examples:linux:docker:arm64:gtk3 - Docker build with GTK3 (ARM64)
This allows testing both the new GTK4 default and legacy GTK3 builds.
* feat(linux): implement GTK4 dialog system with GtkFileDialog and GtkAlertDialog
Phase 8 of WebKitGTK 6.0/GTK4 implementation.
GTK4 completely replaced the dialog APIs. GTK3's GtkFileChooserDialog
and gtk_dialog_run() are deprecated/removed in GTK4.
File Dialogs (GtkFileDialog):
- gtk_file_dialog_open() for single file selection
- gtk_file_dialog_open_multiple() for multiple files
- gtk_file_dialog_select_folder() for folder selection
- gtk_file_dialog_save() for save dialogs
- Filters use GListStore of GtkFileFilter objects
- All operations are async with GAsyncResult callbacks
Message Dialogs (GtkAlertDialog):
- gtk_alert_dialog_choose() with button array
- Configurable default and cancel button indices
- Async response via callback
Implementation:
- Request ID tracking for async callback matching
- fileDialogCallback/alertDialogCallback C exports
- runChooserDialog/runQuestionDialog Go wrappers
- runOpenFileDialog/runSaveFileDialog convenience functions
* feat(linux): implement GTK4 keyboard accelerators for menu items
Add keyboard accelerator support using gtk_application_set_accels_for_action():
- Add namedKeysToGTK map with GDK keysym values for special keys
- Add parseKeyGTK() to convert key names to GDK keysyms
- Add parseModifiersGTK() to convert Wails modifiers to GDK modifier masks
- Add acceleratorToGTK() for full accelerator conversion
- Add setMenuItemAccelerator() Go wrapper calling C helpers
- Integrate accelerator setting in newMenuItemImpl, newCheckMenuItemImpl,
and newRadioMenuItemImpl during menu item creation
- Update setAccelerator() method on linuxMenuItem to use new function
Completes Phase 9 of GTK4 implementation.
* refactor(linux): extract GTK4 C code to separate files and fix WebKitGTK 6.0 API
Extract C code from linux_cgo_gtk4.go to dedicated C files for better
IDE support and maintainability:
- linux_cgo_gtk4.h: Function declarations and type definitions
- linux_cgo_gtk4.c: C implementations for GTK4/WebKitGTK 6.0
WebKitGTK 6.0 API fixes:
- webkit_web_view_new_with_user_content_manager() removed
-> Use create_webview_with_user_content_manager() with g_object_new()
- WEBKIT_HARDWARE_ACCELERATION_POLICY_ON_DEMAND removed
-> Default to ALWAYS (only ALWAYS/NEVER available in 6.0)
- WebKitJavascriptResult replaced with JSCValue in callbacks
-> sendMessageToBackend now receives JSCValue* directly
Also:
- Remove duplicate show()/hide() methods (use shared file)
- Remove duplicate startResize() (wrong signature)
- Add set_app_menu_model() setter for C global variable access
- Fix webview.Scheme reference to use hardcoded 'wails' string
Note: Some pre-existing compilation errors remain in the codebase
that are unrelated to this refactoring.
* fix(linux): resolve GTK4 compilation errors and add missing platform methods
- Add missing App methods: logPlatformInfo, platformEnvironment, fatalHandler
- Add missing linuxApp methods: hide, show, on, isOnMainThread, getAccentColor
- Add missing CGO functions: getPrimaryScreen, openDevTools, enableDevTools, handleLoadChanged
- Fix options.Linux nil check (struct not pointer)
- Fix runSaveFileDialog return type to match interface
- Fix registerWindow signature to accept pointer type
- Fix GdkRGBA to use float instead of double
- Add webview import for asset request handling
- Add sanity check task to Taskfile for quick compilation verification
* fix(linux): resolve GTK3/GTK4 symbol conflict in operatingsystem package
- Add gtk3 build tag to webkit_linux.go to prevent GTK3 linking in GTK4 builds
- Create webkit_linux_gtk4.go with GTK4/WebKitGTK 6.0 pkg-config
- Move app initialization from init() to newPlatformApp() for cleaner setup
- Fixes runtime crash: 'GTK 2/3 symbols detected in GTK 4 process'
* docs: update implementation tracker for GTK3/GTK4 symbol conflict fix
* fix(linux): add GTK4 activation gate to prevent window creation before app activation
GTK4 requires the application to be 'activated' before gtk_application_window_new()
can be called. This adds a synchronization mechanism:
- Add activated channel and sync.Once to linuxApp struct
- Mark application as activated in activateLinux callback
- Wait for activation in WebviewWindow.Run() before creating windows
Fixes SIGSEGV crash when creating windows on GTK4.
* feat(linux): add primary menu style option and fix GTK4 menu issues
- Add LinuxMenuStyle option for MenuBar vs PrimaryMenu (hamburger) display
- Fix menu separators using GMenu sections instead of separator items
- Fix radio button styling with proper string-valued stateful actions
- Fix app not terminating when last window closed
- Fix Window→Zoom to toggle maximize instead of webview zoom
- Add build constraints to .c/.h files for GTK3 compatibility
- Document MenuStyle option in window reference docs
- Update implementation tracker with session changes
* chore(examples): use PrimaryMenu style in menu example
* feat(linux): implement Systray API v2 with smart defaults and window options
- Add smart defaults for systray click behavior:
- Window only: left-click toggles window
- Menu only: right-click shows menu
- Window + Menu: left-click toggles, right-click shows menu
- Add HideOnEscape and HideOnFocusLost window options:
- HideOnEscape: hides window when Escape key pressed
- HideOnFocusLost: hides window on focus lost (auto-disabled on
focus-follows-mouse WMs like Hyprland, Sway, i3)
- Add WebviewWindow.RegisterKeyBinding() public method
- Fix Linux systray handlers:
- Activate() now calls clickHandler (was doubleClickHandler)
- SecondaryActivate() calls rightClickHandler or opens menu
- ItemIsMenu always false to let handlers control behavior
- Add environment_linux.go with compositor detection:
- detectCompositor(), detectFocusFollowsMouse(), isTilingWM()
- Cursor position detection for Hyprland/Sway
- Add comprehensive manual test suite in v3/test/manual/systray/
- window-only, menu-only, window-menu, custom-handlers, hide-options
- Builds for both GTK3 and GTK4
- README with test matrix for different environments
- Update systray-basic example to use new options
* feat: add doctor-ng package with modern TUI for system diagnostics
Introduces a new pkg/doctor-ng package with a clean public API designed
for reuse by both CLI and future GUI tools. Features include:
- Public API types (Report, SystemInfo, Dependency, DiagnosticResult)
- Platform-specific dependency detection (Linux, macOS, Windows)
- Package manager support (apt, dnf, pacman, emerge, eopkg, nixpkgs, zypper)
- Modern TUI using bubbletea/lipgloss with:
- Interactive dependency navigation (j/k keys)
- Install missing dependencies prompt (i key)
- Refresh/rescan capability (r key)
- Non-interactive mode for CI/scripts (-n flag)
The new command is available as 'wails3 doctor-ng' for testing while
the existing 'wails3 doctor' command remains unchanged.
* fix(doctor-ng): stabilize display order, conditional cursor, add copy to clipboard
- Sort platform extras alphabetically to prevent bouncing
- Only show dependency cursor when there are missing deps to act on
- Add 'c' key to copy sanitized report to clipboard
- Update help text to be contextual based on system state
* feat(doctor-ng): add package manager detection for macOS/Windows, remove unused code
- macOS: detect homebrew, macports, nix; show in platform extras
- Windows: detect winget, scoop, choco; show in platform extras
- Remove unused tui/install.go (replaced by tea.ExecProcess)
- Remove unused stateInstall/viewInstall from model.go
- Remove j/k navigation from help (cursor was already removed)
* feat(cli): add wails3 tool capabilities command
Checks system build capabilities via pkg-config:
- GTK4 and WebKitGTK 6.0 availability
- GTK3 and WebKit2GTK 4.1 availability
- Recommends gtk4 or gtk3 based on what's installed
Output is JSON for easy parsing by Taskfile/scripts.
* fix(linux/gtk4): avoid checkptr errors when building with -race
Go's race detector enables checkptr, which flags storing integers
as pointers (a common GLib/C pattern using GINT_TO_POINTER).
Changes:
- Change signal_connect to accept uintptr_t instead of void* for data
- Change enableDND/disableDND to accept uintptr_t instead of gpointer
- Replace unsafe.Pointer(uintptr(id)) with C.uintptr_t(id) in Go code
- Replace g_object_set/get_data for menu item IDs with Go-side map
- Pass 0 instead of nil for unused signal data parameters
This allows building with 'go build -race' for debugging without
triggering 'checkptr: pointer arithmetic computed bad pointer value'
fatal errors.
* fix(examples/dialogs): use window menu for GTK4 compatibility
GTK4 requires menus to be set on windows, not the application.
Use LinuxMenuStylePrimaryMenu to show menu in header bar.
* test(linux): add manual dialog test suite
Comprehensive test programs for GTK4 dialogs:
- message-info, message-question, message-warning, message-error
- file-open, file-open-multi, file-save, file-directory
Each test has multiple test cases accessible via menu.
Use 'go-task build:gtk4' or 'go-task build:gtk3' to build.
* fix(linux/gtk4): fix file dialog hang by not prematurely freeing dialog
GtkFileDialog is async - gtk_file_dialog_select_folder() returns
immediately and the callback fires later. The defer g_object_unref
was freeing the dialog before the user could interact with it.
GTK manages the dialog lifecycle internally for async operations.
* fix: add mutex to protect runtimeLoaded and pendingJS from races
Multiple goroutines access runtimeLoaded and pendingJS concurrently:
- ExecJS reads/writes from window event handlers
- HandleMessage writes when runtime becomes ready
- InitiateFrontendDropProcessing reads/writes during drag-drop
Added pendingJSMutex to synchronize access. Also changed HandleMessage
to copy pending slice before releasing lock to avoid holding it during
InvokeSync calls.
* fix(linux/gtk4): fix dialog deadlock and alert dialog lifecycle
- dialogs_linux.go: Change InvokeAsync to go func() to prevent deadlock
when show() is called - runQuestionDialog uses InvokeAsync internally
and blocks on channel, which deadlocks if caller is also using InvokeAsync
- linux_cgo_gtk4.c: Remove premature g_object_unref from show_alert_dialog
as GtkAlertDialog is async and GTK manages the lifecycle
- linux_cgo_gtk4.c: Add DEBUG_LOG macro for compile-time debug output
(CGO_CFLAGS="-DWAILS_GTK_DEBUG" go build ...)
- linux_cgo_gtk4.c: Handle cancelled-with-no-error case in file dialogs
- linux_cgo_gtk4.go: Fix runQuestionDialog to use options.Title as message
- linux_cgo_gtk4.go: Add default OK button when no buttons specified
* feat(linux/gtk4): implement custom message dialogs with proper styling
GTK4's GtkAlertDialog lacks icon support and visual differentiation.
This implements a custom GtkWindow-based dialog with:
- Escape key triggers cancel button via GtkEventControllerKey
- Enter key activates default button via gtk_window_set_default_widget
- Custom icons from bytes with gtk_image_set_pixel_size (64px max)
- Symbolic icons for info/warning/error/question dialogs
- 300px minimum width for better short message appearance
- Proper memory cleanup via message_dialog_cleanup()
- close-request returns cancel button index or -1
* fix(linux/gtk4): use native size for custom dialog icons
Custom icons now display at their native size.
Built-in symbolic icons remain at 32px as designed.
* fix(linux/gtk4): implement native file drag-and-drop
Use GtkDropControllerMotion and GtkDropTarget with GTK_PHASE_CAPTURE
to intercept file drops before WebKit's internal GtkDropTargetAsync
handler in the bubble phase.
- Add on_drop_accept to filter for GDK_TYPE_FILE_LIST
- Add motion controller for enter/leave/motion events
- Set capture phase so our handlers run before WebKit's
- Both controllers attached to WebKitWebView widget
* docs: update implementation tracker and dialog docs
- Update IMPLEMENTATION.md with GTK4 dialog progress
- Add GTK4 dialog documentation to reference docs
- Fix RLock -> Lock in cleanup to allow window modification
- Simplify manual dialog test menus (remove nested submenus)
* fix(linux/gtk4): parse runtime call params from query string
WebKitGTK 6.0 sends POST data as URL query parameters for custom URI
schemes instead of in the request body. Add fallback to parse object,
method, and args from query params when body is empty.
* fix(linux): fallback to application menu when no window menu set
Windows without an explicit Linux.Menu option now inherit the
application-level menu set via app.Menu.Set().
* fix(linux/gtk4): implement sync clipboard API
GTK4 uses async clipboard operations. Implement clipboard_get_text_sync
which iterates the GLib main context until the async read completes.
This avoids deadlock when called from the main thread (e.g., menu handlers).
* fix(linux/gtk4): DPI scaling and menu duplication fixes
- Implement proper DPI scaling using gdk_monitor_get_scale (GTK 4.14+)
for fractional scaling support on Linux/GTK4
- Calculate PhysicalBounds correctly by multiplying logical coords by scale
- Fix menu items duplicating when creating new windows by adding
processed flag to prevent re-processing menus
- Add safe type assertion helpers in screen example to prevent crashes
- Add CSS to prevent text selection during drag in screen example
- Document tiling WM limitations (Hyprland, Sway, i3) in official docs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(tests): add GTK3 vs GTK4 benchmark suite
Add comprehensive benchmark suite for comparing GTK3 and GTK4 performance
in Wails applications. Benchmarks cover:
- Screen enumeration and primary screen query
- Window create/destroy, resize, show/hide operations
- Menu creation (simple, complex, with accelerators)
- Event emit and receive timing
- Dialog setup
Includes comparison tool for side-by-side analysis of results.
Usage:
go build -tags gtk3 -o benchmark-gtk3 .
go build -tags gtk4 -o benchmark-gtk4 .
./benchmark-gtk3 && ./benchmark-gtk4
go run compare.go benchmark-GTK3-*.json benchmark-GTK4-*.json
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(examples): add WebView API compatibility checker
Cross-platform example that tests and reports which Web APIs are
available in the current WebView engine. Tests 200+ APIs across
categories:
- Storage (localStorage, IndexedDB, Cache API, File System)
- Network (Fetch, WebSocket, WebTransport, SSE)
- Media (Web Audio, MediaRecorder, Speech APIs)
- Graphics (Canvas, WebGL, WebGL2, WebGPU)
- Device (Geolocation, Sensors, Bluetooth, USB, Serial)
- Workers (Web Workers, Service Workers, Shared Workers)
- Performance (Observers, Timing APIs)
- Security (Web Crypto, WebAuthn, Credentials)
- UI/DOM (Custom Elements, Shadow DOM, Clipboard)
- CSS (CSSOM, Container Queries, Modern Selectors)
- JavaScript (ES Modules, BigInt, Private Fields)
Useful for understanding API availability differences between:
- WebKitGTK (Linux) vs WebView2 (Windows) vs WKWebView (macOS)
- GTK3/WebKit2GTK 4.1 vs GTK4/WebKitGTK 6.0
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(examples): add Web API examples demonstrating browser capabilities
Add 15 interactive Web API examples in v3/examples/web-apis/:
- Storage: localStorage, IndexedDB
- Network: Fetch API, WebSocket
- Media: Canvas 2D, WebGL, Web Audio
- Device: Geolocation, Clipboard, Fullscreen
- Security: WebCrypto
- Notifications API
- Workers: Web Workers
- Observers: Intersection Observer, Resize Observer
Each example includes an interactive demo with API documentation
and feature detection to help developers understand what's
available in WebView environments.
Also updates webview-api-check with autorun support for
automated API compatibility testing.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(examples): add 26 more Web API examples
Expand web-apis examples from 15 to 41 total, covering:
Storage: sessionStorage, Cache API, Page Visibility
Network: XMLHttpRequest, EventSource (SSE), Beacon API
Media: MediaDevices, MediaRecorder, Speech Synthesis
Device: Device Orientation, Vibration, Gamepad
Performance: Performance API, Mutation Observer
UI/DOM: Web Components, Pointer Events, Selection, Dialog
Messaging: Drag and Drop, Broadcast Channel, History API
Data: Streams, File API, Blob, Share, Permissions
Each example includes interactive demos, API detection,
and follows the consistent dark-themed styling pattern.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: update changelog with full web-api examples count
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor(examples): simplify beacon demo with local server
Replace the complex beacon demo with a simpler version that includes:
- Local HTTP server on port 9999 that receives beacon data
- Go service to retrieve and display received beacons
- Quick buttons for common beacon types (pageview, click, error, timing)
- Live display of received beacon data with auto-refresh
- Clear explanation of how the demo works
This makes the demo more educational by showing both the sending
and receiving sides of the Beacon API.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor(examples): streamline beacon demo UI
Revert to original standalone implementation with httpbin.org endpoint
but with a compact two-column layout that fits without scrolling:
- Left: endpoint config, data type selector, data input, example buttons
- Right: stats (sent/queued/failed/bytes), auto-unload option, event log
Features retained: String/JSON/FormData/Blob data types, analytics/error/
timing examples, auto-beacon on page unload.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor(examples): streamline blob demo with tabbed layout
Redesign blob demo to fit without scrolling using:
- Three-column layout: Create | Stored Blobs | Output
- Tabbed interface for blob creation (Text/JSON/Binary/SVG)
- Compact blob list with download and delete actions
- Operations panel for conversions and slicing
- Feature badges showing API support status
Reduced from 846 lines to 349 lines while keeping core functionality.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(examples): fix dropdown styling in blob demo
Style select option elements with dark background to match theme.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(examples): add MDN links to demo titles
Link API names in titles to their MDN documentation pages.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor(examples): streamline broadcast-channel with Wails windows
Redesign broadcast-channel demo for Wails environment:
- Replace browser tabs with Wails windows via WindowService
- Compact two-column layout: Channel/Send | Messages
- "Open New Window" button creates new Wails window
- Each window gets unique ID for message tracking
- Join/leave notifications when windows open/close
- Quick message buttons, ping all, stats display
- MDN link in title
Reduced from 737 lines to 245 lines.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(examples): simplify broadcast-channel to use multiple app instances
Remove WindowService that required generated bindings. Instead, instruct
users to run multiple instances of the app to test cross-window messaging.
BroadcastChannel API works across windows of the same origin.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(examples): add API feature badges to broadcast-channel demo
Show supported features: BroadcastChannel, postMessage, close,
onmessage, onmessageerror, MessageChannel - consistent with other demos.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(examples): add multi-window support to broadcast-channel demo
Use Wails runtime.js and WindowService to open new windows for
cross-window BroadcastChannel API testing. Streamlined UI with
feature detection badges and MDN link.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(linux): make GTK4 opt-in via -tags gtk4, keep GTK3 as default
This change inverts the build tag logic so that:
- GTK3/WebKit2GTK 4.1 is the stable default (no tag required)
- GTK4/WebKitGTK 6.0 is experimental opt-in via `-tags gtk4`
This allows the branch to be merged into v3-alpha without breaking
existing apps, while enabling early adopters to test GTK4 support.
Changes:
- Updated 20 Go files: `gtk3` → `!gtk4`, `!gtk3` → `gtk4`
- Updated IMPLEMENTATION.md to reflect new build strategy
- Updated benchmark README with correct build commands
- Added GTK4_FEEDBACK_ISSUE.md template for community testing
- Added Armaan's signing guide link to docs
Build commands after this change:
go build ./v3/... # GTK3 (default)
go build -tags gtk4 ./v3/... # GTK4 (experimental)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor(linux): rename capabilities files to follow naming convention
Renamed for consistency with other GTK3/GTK4 file pairs:
- capabilities_linux.go (default, GTK3)
- capabilities_linux_gtk4.go (opt-in, GTK4)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(linux/gtk4): add experimental notice with feedback issue link
When building with -tags gtk4, the app now displays a notice at startup
directing users to the feedback issue for reporting problems.
Issue: https://github.com/wailsapp/wails/issues/4957
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* ci(linux): add GTK4 testing for webkit-gtk6-support branch
- Fix box alignment in experimental notice
- Add GTK4 dependency installation for this branch only
- Run Go tests with both default (GTK3) and -tags gtk4
- Build examples with both GTK versions
- Build templates with both GTK versions
The GTK4 tests only run when PR source branch is feature/webkit-gtk6-support.
This ensures existing PRs are not affected while enabling full GTK4 CI coverage.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(doctor): make GTK3 primary, GTK4 experimental in package checks
Updated all 7 package managers to match new build tag strategy:
- GTK3/WebKit2GTK 4.1 → primary (required for default builds)
- GTK4/WebKitGTK 6.0 → optional/experimental (for -tags gtk4)
Affected: apt, dnf, pacman, zypper, emerge, eopkg, nixpkgs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs(dialogs): fix GTK3/GTK4 documentation to reflect default behavior
GTK3 is the default, GTK4 is opt-in via -tags gtk4. Updated the dialogs
documentation to clarify this instead of suggesting GTK3 is opt-in.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(examples): escape HTML in web-apis examples to prevent DOM XSS
Add escapeHtml() helper function and escape all user-controlled or
dynamic values before inserting them into innerHTML to address CodeQL
security alerts.
Files fixed:
- beacon: escape log type, message, and class names
- eventsource: escape time and type in log entries
- file-api: escape file name, size, and type
- mediadevices: escape time, type, and message in log entries
- selection: escape text content before applying highlight regex
- share: escape file name, size, and type in file list
- speech-synthesis: escape time, type, and message in log entries
- web-components: escape title and color in shadow DOM template
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(linux): correct GTK4 build tags and Taskfile for GTK3 default
- Fix build tags in linux_cgo_gtk4.c and linux_cgo_gtk4.h from
`!gtk3` to `gtk4` to match the Go file constraints
- Update Taskfile.yaml to reflect GTK3 as default, GTK4 as opt-in
- Rename test:example:linux:gtk3 to test:example:linux:gtk4
- Comment out GTK4 tests in test:examples since CI doesn't have GTK4 deps
This fixes the CI failure where GTK4 C files were being compiled
by default due to incorrect build constraints.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(systemtray): add missing defaultClickHandler method
Add the defaultClickHandler method that was in v3-alpha but not
properly merged. This method is called from systemtray_darwin.go
when handling tray icon clicks.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(tests): add linux build constraint to gtk4-benchmark
The gtk4-benchmark test is Linux-only but was missing a build
constraint on main.go, causing build failures on macOS/Windows.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* ci(linux): skip hanging GTK4 service tests in CI
The service startup/shutdown tests hang in GTK4 CI environment due to
display initialization issues with xvfb. Skip these specific tests for
now while keeping other GTK4 tests running.
Skipped tests:
- TestServiceStartup
- TestServiceShutdown
- TestServiceStartupShutdown
The *Error variants of these tests still run as they fail fast before
the hang occurs.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* ci(linux): skip all service tests for GTK4 in CI
All service tests hang in GTK4 CI because they require a fully
functional GTK4 display that xvfb cannot provide. Skip all tests
matching "TestService" pattern.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* ci(linux): remove unsupported GTK4 template build test
The wails build command doesn't support the -tags flag yet.
GTK4 compilation is already verified by Go tests, so this
additional template build step is not necessary.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Fix Copilot review feedback on PR #4958
- Use JSON.stringify() for onclick handlers in storage examples to safely
handle keys with quotes (sessionstorage, localstorage)
- Guard DeviceOrientationEvent check to prevent ReferenceError on
unsupported browsers (device-orientation)
- Add type assertion check for Bounds to prevent panic on malformed
JSON (screens.go)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
|
||
|
|
247ce87fe7 |
fix(v3): App Exposé shows “ghost” window after calling App.Window.Current() (#4947)
* fix(macOS): run getCurrentWindowID on main thread and add nil checks AppKit must be used on the main thread. getCurrentWindowID could be called from arbitrary Go goroutines, so dispatch to the main queue when not already on the main thread. Also guard NSApp, window, and delegate with nil checks and fall back to mainWindow when keyWindow is nil to avoid wrong or missing window ID. * Update UNRELEASED_CHANGELOG.md * Update UNRELEASED_CHANGELOG.md * Update UNRELEASED_CHANGELOG.md * fix: consistent indentation and changelog formatting - Convert spaces to tabs in getCurrentWindowID() for codebase consistency - Move changelog entry below the <!-- Bug fixes --> comment Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Lea Anthony <lea.anthony@gmail.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
c0d2c1e237 |
fix(runtime): file drop not working with @wailsio/runtime npm module (#4953)
* fix(runtime): use internal path for HandlePlatformFileDrop The Go backend was calling window.wails.Window.HandlePlatformFileDrop() for native file drops on macOS/Linux. This only worked with the bundled runtime which sets window.wails = Runtime. When using the @wailsio/runtime npm module, window.wails is an empty object because the npm module only exports via ES modules and registers the handler at window._wails.handlePlatformFileDrop. Changed the Go code to call the internal path that both runtime distributions set up: window._wails.handlePlatformFileDrop() Also added a test case that uses the npm module to verify the fix. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: add changelog entry for npm runtime DND fix Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: add built frontend dist for dnd-npm-runtime test Required for go:embed to work in CI. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: update README to reflect pre-built frontend Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
cef60037fd |
fix(v3): implement file picker for input type=file on macOS (#4862)
Add WKUIDelegate protocol support to handle runOpenPanelWithParameters delegate method, which is required for <input type="file"> elements to work in WKWebView on macOS. This was a regression from V2 which had this implementation. Changes: - Add WKUIDelegate to WebviewWindowDelegate protocol list - Set UIDelegate on WKWebView during window creation - Implement runOpenPanelWithParameters to show NSOpenPanel for file selection Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
1f45359485 |
fix(v3/linux): fix OpenFileDialog crash from GTK thread violation (#4926)
* fix(v3/linux): fix OpenFileDialog crash from GTK thread violation The runChooserDialog function had a race condition that caused GTK assertion failures and crashes on Linux: 1. InvokeAsync scheduled gtk_dialog_run on the GTK thread 2. After dialog closed, a goroutine was spawned OFF the GTK thread 3. gtk_widget_destroy was called immediately (before goroutine ran) 4. Goroutine tried to call gtk_file_chooser_get_filenames on destroyed widget Fix: - Extract filenames on GTK thread BEFORE destroying widget - Call gtk_widget_destroy on GTK thread AFTER extraction - Goroutine only handles sending Go strings (no GTK calls) Fixes #3683 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: add changelog entry for OpenFileDialog crash fix Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: properly free all filenames to prevent memory leak When more than 1024 files are selected, the previous code leaked memory because g_slist_free() only frees list nodes, not the data pointers. Now we iterate through ALL entries, freeing each filename string. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: remove arbitrary 1024 file selection limit GTK's gtk_file_chooser_get_filenames() has no documented maximum. The limit was arbitrary and unnecessary. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: add comment about no file selection limit Consistent with Windows/macOS behavior. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: ddmoney420 <ddmoney420@users.noreply.github.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Lea Anthony <lea.anthony@gmail.com> |
||
|
|
37e57f679d |
fix(v3/windows): Move browser flags to application-level options (#4559) (#4946)
* fix(v3/windows): Move browser flags to application-level options (#4559) WebView2 shares a single browser environment per user data path, so browser flags (EnabledFeatures, DisabledFeatures, AdditionalBrowserArgs) must be set at application level, not per-window. Changes: - Add EnabledFeatures, DisabledFeatures, AdditionalBrowserArgs to application.Options.Windows - Mark per-window equivalents in WindowsWindow as deprecated - Update webview_window_windows.go to read from app-level options This fixes the crash when opening a second window with different browser flags. Fixes #4559 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: address PR review comments - Remove incorrectly added WebviewGpuPolicy field from WindowsOptions (it's a Linux-specific option that already exists in LinuxWindow) - Clarify changelog: AdditionalLaunchArgs was renamed to AdditionalBrowserArgs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor!: remove per-window browser flags (breaking change) BREAKING CHANGE: Remove EnabledFeatures, DisabledFeatures, and AdditionalLaunchArgs from per-window WindowsWindow options. Use application-level options instead: - Options.Windows.EnabledFeatures - Options.Windows.DisabledFeatures - Options.Windows.AdditionalBrowserArgs These flags apply globally to the shared WebView2 environment, so per-window configuration was never actually supported. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: add documentation for application-level browser flags - Document EnabledFeatures, DisabledFeatures, AdditionalBrowserArgs - Add examples showing how to configure WebView2 browser flags - Explain that these flags apply globally to all windows - Update application API reference with platform-specific options Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: simplify browser flags documentation Remove unnecessary warnings and overly prescriptive comments. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: clarify that AdditionalBrowserArgs requires -- prefix Chromium command-line switches require the -- prefix. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
5d0dd30685 |
fix(v3): guard dispatchWailsEvent against race condition on reload (#4925)
* fix(v3): guard dispatchWailsEvent against race condition on reload When the page is reloaded, the WindowLoadFinished event can fire before the JavaScript runtime has mounted dispatchWailsEvent on window._wails. This causes a TypeError: window._wails.dispatchWailsEvent is not a function. This fix adds a guard to check if window._wails and dispatchWailsEvent exist before attempting to call the function. If the runtime isn't ready, the event is silently skipped (which is correct since there's no handler). Fixes #4872 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: Add changelog entry for #4872 --------- Co-authored-by: ddmoney420 <ddmoney420@users.noreply.github.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Lea Anthony <lea.anthony@gmail.com> |
||
|
|
fa06d48497 |
feat(v3): Add UseApplicationMenu option for cross-platform menu support (#4944)
* feat(v3): Add UseApplicationMenu option for cross-platform menu support Add `UseApplicationMenu` option to `WebviewWindowOptions` that allows windows on Windows and Linux to inherit the application menu set via `app.Menu.Set()`. This provides a simpler cross-platform approach: - On macOS: No effect (app menu is always global) - On Windows/Linux: Window displays the application menu Benefits: - Eliminates need for platform-specific menu code - Per-window opt-in maintains backwards compatibility - Explicit window menus still take priority Updated: - webview_window_options.go: Added UseApplicationMenu bool field - webview_window_windows.go: Check UseApplicationMenu when no window menu set - webview_window_linux.go: Check UseApplicationMenu when no window menu set - examples/dialogs: Use UseApplicationMenu instead of conditional SetMenu - examples/menu: Use UseApplicationMenu instead of explicit SetMenu - docs: Updated menu and window options documentation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: Remove incorrect 'Menu Options' section header --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
b16458f121 |
fix(darwin): prevent panic on empty Icon slice in dialogs
Change nil checks to length checks before accessing Icon[0] to prevent panic when Icon is an empty slice rather than nil. Fixes #3631 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
19b2ec7fbe |
fix(v3/linux): use g_bytes_new instead of g_bytes_new_static for Go slices (#4923)
* fix(v3): add nil check to Focus() to prevent SIGSEGV after Hide The Focus() method was missing a nil/destroyed check on w.impl, causing a SIGSEGV when Focus() is called on a window that has been hidden and potentially destroyed (e.g., when clicking the dock icon after hiding the window on macOS). This aligns Focus() with Show() and Hide() which already have proper guards against nil/destroyed window implementations. Fixes #4890 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(v3/linux): use g_bytes_new instead of g_bytes_new_static for Go slices g_bytes_new_static expects truly static data that is never freed or moved, but Go's garbage collector can move or free slice memory at any time. This causes SIGSEGV crashes in the GTK event loop when the GC runs and frees memory that GTK still references. The fix replaces g_bytes_new_static with g_bytes_new, which copies the data to C-owned memory that is safe from Go's GC. Also fixes memory leak in setIcon() by adding proper g_bytes_unref and g_object_unref calls for the GBytes and stream objects. Changes: - linux_cgo.go: Replace g_bytes_new_static with g_bytes_new (4 places) - linux_cgo.go: Add cleanup in setIcon() for gbytes and stream - linux_purego.go: Add gBytesNew binding and use it instead of static Fixes #4864 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(linux): add empty slice guards to prevent panic Adds guards to check for empty slices before taking &slice[0] which would panic on empty input. Affects setIcon(), menuItemAddProperties(), menuItemSetBitmap(), and runQuestionDialog() in both CGO and purego. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: ddmoney420 <ddmoney420@users.noreply.github.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Lea Anthony <lea.anthony@gmail.com> |
||
|
|
77cb9866a2 |
Revert "fix(linux): add empty slice guards to prevent panic in icon/bitmap handling"
This reverts commit
|
||
|
|
05cbe108de |
fix(linux): add empty slice guards to prevent panic in icon/bitmap handling
Adds guards to check for empty slices before taking &slice[0] which would panic. Affects setIcon(), menuItemAddProperties(), menuItemSetBitmap(), and runQuestionDialog() in both CGO and purego implementations. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
37fb9b9ba5 |
fix(v3/linux): Fix menu update by clearing menu (#4875)
* clear menu * update changelog * free list * register glistfree |
||
|
|
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. |
||
|
|
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> |
||
|
|
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. |
||
|
|
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> |
||
|
|
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. |
||
|
|
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> |
||
|
|
0de429b8fc |
feat(macos): add CollectionBehavior option to MacWindow (#4799)
* feat(macos): add CollectionBehavior option to MacWindow (#4756) Add configurable NSWindowCollectionBehavior support for macOS windows, allowing control over window behavior across Spaces and fullscreen. New options include: - MacWindowCollectionBehaviorCanJoinAllSpaces - MacWindowCollectionBehaviorFullScreenAuxiliary - MacWindowCollectionBehaviorMoveToActiveSpace - And more... This enables building Spotlight-like apps that appear on all Spaces or overlay fullscreen applications. Closes #4756 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Potential fix for code scanning alert no. 140: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * Potential fix for code scanning alert no. 139: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * feat(examples): add spotlight example for CollectionBehavior Demonstrates creating a Spotlight-like launcher window that: - Appears on all macOS Spaces - Floats above other windows - Uses accessory activation policy (no Dock icon) - Has frameless translucent design 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat(macos): support bitwise OR for CollectionBehavior options Update CollectionBehavior to use actual NSWindowCollectionBehavior bitmask values, allowing multiple behaviors to be combined: ```go CollectionBehavior: application.MacWindowCollectionBehaviorCanJoinAllSpaces | application.MacWindowCollectionBehaviorFullScreenAuxiliary, ``` Changes: - Update Go constants to use actual bitmask values (1<<0, 1<<1, etc.) - Simplify C function to pass through combined bitmask directly - Add ParticipatesInCycle, IgnoresCycle, FullScreenDisallowsTiling options - Update documentation with combined behavior examples - Update spotlight example to demonstrate combining behaviors 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> |
||
|
|
7bc6501a84 |
[v3] Debug printf statements left in webview_window_darwin.m (#4834)
* Clean up debug output in webView URL scheme handler Removed debug print statements for CSS requests in web view. * Add changelog entry for #4834 * Fix Changelog --------- Co-authored-by: Lea Anthony <lea.anthony@gmail.com> |
||
|
|
2604ecc0f8 |
test(v3): add comprehensive unit tests for pkg/application (#4827)
* test(v3): add comprehensive unit tests for pkg/application Add 11 new test files to improve test coverage of the pkg/application package from 13.6% to 17.7%. New test files: - context_test.go: Context struct operations - services_test.go: Service management and lifecycle - parameter_test.go: Parameter and CallError types - dialogs_test.go: Dialog utilities and button methods - webview_window_options_test.go: Window options and constants - application_options_test.go: ChainMiddleware and app config - keys_test.go: Keyboard accelerator parsing - single_instance_test.go: Single instance management and encryption - menuitem_internal_test.go: Menu item internal functions - menu_internal_test.go: Menu internal functions - screenmanager_internal_test.go: Screen geometry and transformations The 40% target was not fully achievable because ~50% of the codebase is platform-specific code that can only be tested on respective platforms. Tests focus on pure Go logic, utility functions, and data structures that can be tested cross-platform. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: address CodeRabbit review comments - dialogs_test.go: improve ID recycling test to verify either recycled ID (id3 == id1) or new unique ID (id3 > id2) - keys_test.go: make accelerator String() tests platform-agnostic by checking suffix patterns rather than exact platform-specific strings 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: normalize temp dir path for macOS compatibility in test os.TempDir() returns a trailing slash on macOS, causing path comparison to fail. Use filepath.Clean() to normalize both paths. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove REVIEW.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: simplify changelog entry 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
f30c888c5b |
fix(windows): Prevent systray menu crash on rapid clicks (#4151) (#4812)
Add guard against concurrent TrackPopupMenuEx calls using atomic.Bool to prevent race condition when user clicks systray icon repeatedly. Change TrackPopupMenuEx failure from fatal to debug log with early return so the application gracefully handles failed menu display attempts instead of crashing. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Vibe Kanban <noreply@vibekanban.com> Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
9174be76f2 |
Prevent app crashing when calling systray.Run() before app.Run() (#4826) | ||
|
|
84b9021ea9 |
docs: Update dialogs documentation to match actual v3 API (#4793)
* All the documentation files have been updated. Here's a summary of the changes I made:
## Summary of Documentation Updates
### Key API Corrections Made:
1. **Dialog Creation**:
- Changed `app.InfoDialog()` → `application.InfoDialog()` (package-level functions)
- Also documented `app.Dialog.Info()` via DialogManager
2. **Question Dialog Buttons**:
- Removed non-existent `SetButtons("Save", "Don't Save", "Cancel")` method
- Now uses `AddButton("label")` which returns a `*Button`
- Button callbacks via `button.OnClick(func() { ... })`
3. **Default/Cancel Buttons**:
- Changed `SetDefaultButton("Cancel")` (string) → `SetDefaultButton(cancelBtn)` (`*Button`)
- Changed `SetCancelButton("Cancel")` (string) → `SetCancelButton(cancelBtn)` (`*Button`)
- Also documented fluent `SetAsDefault()` and `SetAsCancel()` methods on Button
4. **File Dialog Filters**:
- Changed `SetFilters([]application.FileFilter{...})` → `AddFilter("Display Name", "*.ext;*.ext2")`
5. **Save Dialog Filename**:
- Changed `SetDefaultFilename()` → `SetFilename()`
6. **Folder Selection**:
- Removed non-existent `app.SelectFolderDialog()`
- Now uses `application.OpenFileDialog().CanChooseDirectories(true).CanChooseFiles(false)`
7. **Show() Return Value**:
- Removed incorrect `result, err := dialog.Show()` pattern
- `Show()` returns nothing - responses are handled via button callbacks
### Files Modified:
- `docs/src/content/docs/features/dialogs/message.mdx` - Complete rewrite of question dialog examples
- `docs/src/content/docs/features/dialogs/overview.mdx` - Updated all code examples
- `docs/src/content/docs/features/dialogs/file.mdx` - Updated file dialog examples
- `v3/UNRELEASED_CHANGELOG.md` - Added changelog entry
* All changes are complete. Here's a summary of what was updated:
## Summary
I've updated the Wails v3 dialogs documentation to match the actual API. The documentation now consistently uses:
### DialogManager Pattern (Recommended)
- `app.Dialog.Info()`, `app.Dialog.Question()`, `app.Dialog.Warning()`, `app.Dialog.Error()`
- `app.Dialog.OpenFile()`, `app.Dialog.SaveFile()`
This is consistent with other runtime features like `app.Window`, `app.Event`, etc.
### Key API Corrections
1. **Dialog Creation**: Both `app.Dialog.*()` (DialogManager) and `application.*Dialog()` (package-level) are documented
2. **Question Dialog Buttons**: Use `AddButton("label")` which returns `*Button`, then `button.OnClick(callback)`
3. **Default/Cancel Buttons**: `SetDefaultButton(button)` and `SetCancelButton(button)` take `*Button` pointers
4. **File Filters**: Use `AddFilter("Display Name", "*.ext")` instead of `SetFilters()`
5. **Save Dialog Filename**: Use `SetFilename()` instead of `SetDefaultFilename()`
6. **Folder Selection**: Use `app.Dialog.OpenFile().CanChooseDirectories(true).CanChooseFiles(false)`
### Files Modified
- `docs/src/content/docs/features/dialogs/overview.mdx`
- `docs/src/content/docs/features/dialogs/message.mdx`
- `docs/src/content/docs/features/dialogs/file.mdx`
- `v3/UNRELEASED_CHANGELOG.md`
* Audit complete! All documentation files now consistently use `app.Dialog.*` for all code examples. Here's the summary:
## Audit Complete
All dialog documentation has been updated to consistently use the `app.Dialog.*` pattern:
### Changes Made:
**message.mdx:**
- All examples now use `app.Dialog.Info()`, `app.Dialog.Question()`, `app.Dialog.Warning()`, `app.Dialog.Error()`
- Function signatures updated to accept `app *application.App` parameter
- Nested dialog calls within callbacks also updated
**file.mdx:**
- All examples now use `app.Dialog.OpenFile()`, `app.Dialog.SaveFile()`
- Function signatures updated to accept `app *application.App` parameter
- All error/info dialogs within file operations also updated
**overview.mdx:**
- Already consistent from earlier edits
### Documentation Structure:
Each file now properly documents both approaches in a dedicated section:
```go
// Via DialogManager (recommended when you have an app instance):
app.Dialog.Info()
app.Dialog.OpenFile()
// Package-level functions (useful in callbacks or when app isn't in scope):
application.InfoDialog()
application.OpenFileDialog()
```
But all code examples use the `app.Dialog.*` pattern for consistency with other runtime features like `app.Window`, `app.Event`, etc.
* docs: Fix reference/dialogs.mdx and reference/application.mdx API documentation
Updated docs to match actual Wails v3 Dialogs API:
- reference/dialogs.mdx: Complete rewrite with correct API
- Use `app.Dialog.OpenFile()` and `app.Dialog.SaveFile()` instead of `app.OpenFileDialog()`
- Use `AddFilter("name", "pattern")` instead of `SetFilters([]FileFilter{...})`
- Use `SetFilename()` instead of `SetDefaultFilename()`
- Use `SetDirectory()` instead of `SetDefaultDirectory()`
- Remove non-existent `SelectFolderDialog()` - use `OpenFile().CanChooseDirectories(true).CanChooseFiles(false)`
- Use `AddButton()` with callbacks instead of `SetButtons()`
- Use `SetDefaultButton(*Button)` instead of `SetDefaultButton(int)`
- Document that `Show()` returns nothing, use callbacks
- reference/application.mdx: Fix Dialog Methods section
- Use `app.Dialog.*` manager pattern
- Show correct Question dialog with button callbacks
- Fix file dialog examples with `AddFilter()`
- Remove `SelectFolderDialog()` reference
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: Remove package-level dialog function references
Remove all references to package-level dialog functions
(application.InfoDialog(), application.OpenFileDialog(), etc.)
from documentation. Only the app.Dialog manager pattern
should be used.
Updated files:
- reference/dialogs.mdx
- features/dialogs/overview.mdx
- features/dialogs/message.mdx
- features/dialogs/file.mdx
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: Remove package-level dialog functions in favor of app.Dialog manager
BREAKING CHANGE: Remove package-level dialog functions. Use app.Dialog manager instead.
Removed functions:
- application.InfoDialog()
- application.QuestionDialog()
- application.WarningDialog()
- application.ErrorDialog()
- application.OpenFileDialog()
- application.SaveFileDialog()
Use the Dialog manager pattern instead:
- app.Dialog.Info()
- app.Dialog.Question()
- app.Dialog.Warning()
- app.Dialog.Error()
- app.Dialog.OpenFile()
- app.Dialog.SaveFile()
This aligns dialogs with other runtime managers like app.Window and app.Event.
Updated files:
- v3/pkg/application/application.go - Remove exported dialog functions
- v3/pkg/application/dialog_manager.go - Use internal newMessageDialog/newOpenFileDialog
- v3/pkg/application/messageprocessor_dialog.go - Use internal dialog constructors
- v3/examples/* - Update all examples to use app.Dialog pattern
- v3/internal/commands/appimage_testfiles/main.go - Update test file
- v3/UNRELEASED_CHANGELOG.md - Document breaking change
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: Use application.Get() in dialogs-basic example and correct filter docs
- Update dialogs-basic helper functions to use application.Get() instead
of passing app through function parameters
- Fix incorrect documentation claiming space/comma delimiters work for
filter patterns (only semicolons are supported)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
|
||
|
|
f3af37be72 |
fix(darwin): prevent window destruction when hiding with ApplicationShouldTerminateAfterLastWindowClosed (#4800)
* ## Summary I've verified and fixed the bug reported in GitHub issue #4389. Here's what was done: ### Root Cause Analysis The crash occurred on macOS when using `Hide()` and `Show()` to toggle window visibility via a system tray. The sequence was: 1. `Hide()` calls `orderOut:nil` which removes the window from screen 2. With `ApplicationShouldTerminateAfterLastWindowClosed = true` (default), macOS considers the app to have no visible windows 3. macOS triggers `windowShouldClose:` which emits `EventWindowShouldClose` 4. The event mapping translates this to `Common.WindowClosing` 5. The `WindowClosing` handler destroys the window and removes it from the window map 6. When `Show()` is called later, the window doesn't exist anymore → crash ### Fix Implementation **File: `v3/pkg/application/webview_window_close_darwin.go`** - Added new exported function `windowIsHidden()` that checks if a window is marked as hidden via `window.options.Hidden` **File: `v3/pkg/application/webview_window_darwin.m`** - Added extern declaration for `windowIsHidden` - Modified `windowShouldClose:` delegate method to return `false` early (without emitting close events) if the window is hidden The fix ensures that when a window is intentionally hidden (not closed), the close event sequence is not triggered, preserving the window for later re-showing. ### Test Case Created Created `v3/tests/systray-hide-show-test/` - a test application that: - Creates a window and system tray - Clicking the tray toggles window visibility - Previously crashed after hide→show→hide sequence; now works correctly ### Files Modified 1. `v3/pkg/application/webview_window_close_darwin.go` - Added `windowIsHidden()` function 2. `v3/pkg/application/webview_window_darwin.m` - Check hidden state in `windowShouldClose:` 3. `v3/UNRELEASED_CHANGELOG.md` - Added fix entry ### Files Added 1. `v3/tests/systray-hide-show-test/main.go` - Test case 2. `v3/tests/systray-hide-show-test/icon.png` - Icon for test All existing tests pass. The fix is minimal and targeted, only affecting the specific scenario where a hidden window receives a close query. * Done. The redundant test case has been removed. The fix is covered by the existing `v3/examples/hide-window/` example. Current staged changes: - Deleted `v3/tests/systray-hide-show-test/` (test case, icon, and binary) The fix itself (in `webview_window_close_darwin.go` and `webview_window_darwin.m`) and the changelog entry were already committed in the previous commit. |
||
|
|
531f9e0c5b |
fix(v3): fix context menu memory leak and improve native resource reuse (#4801)
All tests pass. Let me provide a summary of the changes. ## Summary This issue (#4012) is about **Dynamic Context Menu** support, labeled as a Bug affecting macOS. ### Root Cause Analysis I identified two related issues: 1. **macOS Memory Leak**: In `webview_window_darwin.go`, the `openContextMenu` function created a **new** `macosMenu` and `NSMenu` every time a context menu was displayed, ignoring any existing `menu.impl`. This caused: - Memory leaks (NSMenu objects never released) - Wasted CPU cycles rebuilding the native menu each time - Inconsistent behavior with other platforms 2. **Windows Memory Leak**: In `webview_window_windows.go`, the `openContextMenu` function created a new `Win32Menu` each time without destroying the previous one, leaking Windows menu handles. ### Fixes Applied **1. macOS (`v3/pkg/application/webview_window_darwin.go:889-897`):** ```go func (w *macosWebviewWindow) openContextMenu(menu *Menu, data *ContextMenuData) { // Reuse existing impl if available, otherwise create new one if menu.impl == nil { menu.impl = newMenuImpl(menu) } thisMenu := menu.impl.(*macosMenu) thisMenu.update() C.windowShowMenu(w.nsWindow, thisMenu.nsMenu, C.int(data.X), C.int(data.Y)) } ``` This now: - Reuses existing `menu.impl` if available (consistent with Linux) - Only creates new impl on first display - The `update()` call still rebuilds native items from current Go state for dynamic updates **2. Windows (`v3/pkg/application/webview_window_windows.go:1174-1184`):** ```go func (w *windowsWebviewWindow) openContextMenu(menu *Menu, _ *ContextMenuData) { // Destroy previous context menu if it exists to prevent memory leak if w.currentlyOpenContextMenu != nil { w.currentlyOpenContextMenu.Destroy() } // Create the menu from current Go-side menu state thisMenu := NewPopupMenu(w.hwnd, menu) thisMenu.Update() w.currentlyOpenContextMenu = thisMenu thisMenu.ShowAtCursor() } ``` This now properly destroys the old `Win32Menu` before creating a new one. **3. Updated `v3/UNRELEASED_CHANGELOG.md`** with fix entries. ### Files Changed - `v3/pkg/application/webview_window_darwin.go` - `v3/pkg/application/webview_window_windows.go` - `v3/UNRELEASED_CHANGELOG.md` ### Testing - Build passes ✓ - All existing tests pass ✓ - Manual testing recommended using `v3/examples/contextmenus` app |
||
|
|
35500c891e |
fix(macos): Show hidden windows when dock icon is clicked (#4583) (#4790)
When an application starts with Hidden: true, clicking the dock icon now correctly shows the window. This matches standard macOS UX where clicking the dock icon should bring up the app's windows. The fix adds a default handler for ApplicationShouldHandleReopen that automatically shows all hidden windows when there are no visible windows. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
2c9d23b040 |
fix(macos): fix print dialog not opening and add Window.Print() to runtime (#4789)
fix(macos): fix print dialog not opening and add Window.Print() to runtime (#4290) The print dialog was not opening on macOS because the CGO windowPrint function was passing the wrong pointer type to NSPrintOperation's runOperationModalForWindow method. It was passing the raw void* window instead of the properly cast WebviewWindow* nsWindow. This also adds a Window.Print() method to the JavaScript runtime, allowing frontend code to trigger the print dialog directly without needing a Go binding. Changes: - Fix webview_window_darwin.go to use nsWindow instead of window - Add WindowPrint constant (51) and handler to messageprocessor_window.go - Add Print() method to window.ts in the runtime - Rebuild bundled runtime (runtime.js and runtime.debug.js) - Add print example in v3/examples/print to demonstrate both Go API and JS runtime methods - Update API documentation for Window.Print() in both Go and JavaScript references 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
f0a8bcad34 |
feat(linux): add WebKit2 load-change events (#4783)
* All changes are complete. Here's a summary of what was implemented for issue #3896: ## Summary Added four new WebKit2 load-change events for Linux to match WebKitGTK's documented load-change signals: ### New Events | Event | ID | WebKit Signal | Description | |-------|-----|---------------|-------------| | `WindowLoadStarted` | 1059 | `WEBKIT_LOAD_STARTED` | Fired when page load begins | | `WindowLoadRedirected` | 1060 | `WEBKIT_LOAD_REDIRECTED` | Fired when a redirect occurs | | `WindowLoadCommitted` | 1061 | `WEBKIT_LOAD_COMMITTED` | Fired when load is committed | | `WindowLoadFinished` | 1062 | `WEBKIT_LOAD_FINISHED` | Fired when load completes | ### Files Modified 1. **`v3/pkg/events/events.go`** - Added new event types to `linuxEvents` struct and updated all platform event IDs (Mac, Windows, iOS shifted by +4 to accommodate new Linux events) 2. **`v3/pkg/events/events_linux.h`** - Added C defines for new events 3. **`v3/pkg/application/linux_cgo.go`** - Updated `handleLoadChanged()` to dispatch all four load events 4. **`v3/UNRELEASED_CHANGELOG.md`** - Documented the new feature ### Backward Compatibility - The existing `WindowLoadChanged` event (1058) continues to fire on `WEBKIT_LOAD_FINISHED` for backward compatibility - `WindowLoadFinished` also fires on `WEBKIT_LOAD_FINISHED` for consistent naming with the new events Would you like me to commit these changes? * These are the remaining changes that need to be committed - the generator properly updated: 1. `events.txt` - source of truth for events 2. `event_types.ts` - TypeScript runtime types for JS/TS clients 3. `events_darwin.h` - Mac C header with updated event IDs 4. `events_ios.h` - iOS C header with updated event IDs These are the final changes needed on top of the previous commit. Would you like me to commit these changes? * chore: add new Linux WebKit2 load events to known_events.go Add WindowLoadStarted, WindowLoadRedirected, WindowLoadCommitted, and WindowLoadFinished to the known events registry. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * docs: add Linux WebKit2 load events to events-reference guide Document the new WindowLoadStarted, WindowLoadRedirected, WindowLoadCommitted, and WindowLoadFinished events in the Linux Events section of the events reference guide. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Update UNRELEASED_CHANGELOG * refactor(linux): remove deprecated WindowLoadChanged event Remove the legacy WindowLoadChanged event and replace all internal references with WindowLoadFinished. This simplifies the event system by having granular events (LoadStarted, LoadRedirected, LoadCommitted, LoadFinished) rather than a generic LoadChanged that fired on any state. - Remove WindowLoadChanged from events.go and event_types.ts - Update linux_cgo.go to only fire WindowLoadFinished - Update webview_window_linux.go hooks to use WindowLoadFinished - Regenerate runtime bundles and known_events - Update events documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: add breaking change note for WindowLoadChanged removal 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
54942d4f34 |
[v3] Fix not enough memory error when initialising drag and drop on Windows
Fix not enough memory error when initialising drag and drop on windows Co-authored-by: Andraz Vrhovec <andraz@koofr.net> Co-authored-by: Lea Anthony <lea.anthony@gmail.com> |
||
|
|
e80cf28578 |
fix: prevent window menu crash on Wayland (#4769) (#4770)
* fix: prevent window menu crash on Wayland by realizing window before showing On Wayland with GTK3, the appmenu-gtk-module tries to set DBus properties for global menu integration before the window is fully realized, causing a crash with the error "GDK_IS_WAYLAND_WINDOW (window) assertion failed". The fix calls gtk_widget_realize() before gtk_widget_show_all() to ensure the window has a valid GdkWindow when the menu system accesses it. This fix is applied to both the CGO and purego implementations. Fixes wailsapp/wails#4769 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add Wayland detection to wails3 doctor and test for #4769 - Add Wayland session detection row to `wails3 doctor` output on Linux - Create test project v3/test/4769-menu to manually verify the menu fix 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: sanitize GTK application name to prevent crashes with invalid characters Application names containing spaces, parentheses, hash symbols, or other invalid characters would cause GTK to fail with an assertion error. Added sanitizeAppName() function that: - Replaces invalid characters with underscores - Handles leading digits - Removes consecutive underscores - Defaults to "wailsapp" if empty 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
c4b614cb10 |
fix: use structured logging for debug/info methods (#4767)
* fix: use structured logging for debug/info methods The debug() and info() methods were using fmt.Sprintf() which expects printf-style format directives, but callers were using slog-style key-value pairs. Changed to pass args directly to Logger.Debug/Info which properly handles structured logging. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * docs: add changelog entries for build fixes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * chore: remove temporary debug print statements from mobile merge Remove emoji debug logs (🔴, 🟢, 🟠, 🔵, 🔥) that were accidentally left in from the iOS/Android mobile platform support merge. These were development debugging statements that should not have been included in the final code. Files cleaned: - application.go - application_debug.go - init_android.go - init_ios.go - mainthread_android.go - mainthread_ios.go - webview_window.go - webview_window_ios.go 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: add changelog entries for debug cleanup and breaking change - Add breaking change note: production builds are now default - Add entry for debug print statement removal 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: convert remaining printf-style debug calls to slog-style Convert three debug() calls that were still using printf-style format strings to slog-style structured logging (key-value pairs): - systemtray_windows.go: ShellNotifyIcon show/hide failures - application_darwin.go: window lookup failure This addresses CodeRabbit review feedback and ensures consistency with the refactored debug() method. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: convert all printf-style info() calls to slog-style Convert remaining info() calls that were using printf-style format strings to slog-style structured logging (key-value pairs): - application_ios.go: iOS log messages and HandleJSMessage calls - webview_window_windows.go: WM_SYSKEYDOWN logging - application.go: handleWindowMessage and handleWebViewRequest logging Also removed debug fmt.Printf statements from handleWebViewRequest. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: add build tag to main.m to prevent Go from compiling it on non-iOS platforms Go's toolchain tries to process .m (Objective-C) files when they're in a directory with Go files. Adding a //go:build ios tag tells Go to only process this file when building for iOS, matching how darwin .m files handle this (e.g., //go:build darwin && !ios). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove orphaned wails-mimetype-migration submodule reference The iOS merge added a submodule reference without a corresponding .gitmodules file, causing Cloudflare and other CI systems to fail with "No url found for submodule path" errors. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: auto-disable DMA-BUF renderer on Wayland with NVIDIA to prevent crashes WebKitGTK has a known issue with the DMA-BUF renderer on NVIDIA proprietary drivers running Wayland, causing "Error 71 (Protocol error)" crashes. This fix automatically detects NVIDIA GPUs (via /sys/module/nvidia) and sets WEBKIT_DISABLE_DMABUF_RENDERER=1 when running on Wayland. Also removes leftover debug print statements from mobile platform merge. See: https://bugs.webkit.org/show_bug.cgi?id=262607 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add NVIDIA driver info to wails3 doctor on Linux Shows NVIDIA driver version and srcversion in doctor output to help diagnose Wayland/NVIDIA compatibility issues. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
2e396bd48f |
fix(ios): correct service implementation pattern for dock and notifications
The iOS service stubs were importing a non-existent package `github.com/wailsapp/wails/v3/pkg/services` and using an incompatible interface pattern. This fix rewrites both files to follow the same pattern as other platforms (Linux, Windows, Darwin): - Implement the internal platformDock/platformNotifier interfaces - Provide New() functions returning *DockService/*NotificationService - Stub all required interface methods 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
6f4df3206d | [skip ci] Publish @wailsio/runtime v3.0.0-alpha.75 | ||
|
|
d1a7299e27 |
fix: restore events.go from v3-alpha to fix compilation errors
The iOS branch modified events.go with debug println statements and changed the EventProcessor.Emit signature from returning error to void. This broke compatibility with event_manager.go and messageprocessor_events.go. Restored the v3-alpha version which: - Uses atomic.Bool for cancelled flags (thread-safe) - Has EventProcessor.Emit return error for validation - Includes decodeEventData and validateCustomEvent functions - Removes debug println statements 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
637713fae6 |
feat: adapt iOS and Android message processors to RuntimeRequest transport
Transport layer refactor adaptations for mobile platforms: - Refactor processIOSMethod to use RuntimeRequest signature - Refactor processAndroidMethod to use RuntimeRequest signature - Add androidRequest constant (12) and handler to messageprocessor.go - Update messageprocessor_mobile_stub.go for non-mobile builds - Fix undefined windowID variable (use req.WebviewWindowID) - Add iOS event generation to tasks/events/generate.go - Add InvalidIOSCallError and InvalidAndroidCallError to errs package - Update iOS delegate and webview files with generated event handlers iOS methods refactored: Haptics.Impact, Device.Info, Scroll settings, Navigation gestures, Link previews, Debug inspector, UserAgent Android methods refactored: Haptics.Vibrate, Device.Info, Toast.Show 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
c62a094b9a |
fix: resolve merge conflict in AndroidOptions and add AGENTS.md
- Fix merge conflict marker in application_options.go - Add AGENTS.md with beads workflow documentation for AI agents 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
96dff3885d |
Merge Android support from v3-alpha-feature/android-support
This commit integrates Android platform support for Wails v3. Key changes: - Add Android-specific application, webview, and runtime files - Add Android event types - Add Android examples and build system (Gradle) - Add JNI bridge for Go <-> Java communication - Update application options for Android configuration - Add Android include to common Taskfile template Note: The Android branch was more recent than the iOS branch and had fewer conflicts with the transport layer refactor. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
873848a077 |
Merge iOS support from v3-alpha-feature/ios-support
This commit integrates iOS platform support for Wails v3, adapting the iOS-specific code to work with the new transport layer architecture. Key changes: - Add iOS-specific application, webview, and runtime files - Add iOS event types and processing - Add iOS examples and templates - Update messageprocessor to handle iOS requests - Move badge_ios.go to dock package Note: The iOS branch was based on an older v3-alpha and required significant conflict resolution due to the transport layer refactor (PR #4702). Some iOS-specific code may need further adaptation: - processIOSMethod needs to be implemented with new RuntimeRequest signature - iOS event generation in tasks/events/generate.go needs updating 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |