mirror of
https://github.com/wailsapp/wails.git
synced 2026-03-15 15:15:51 +01:00
* 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.
112 lines
2.6 KiB
YAML
112 lines
2.6 KiB
YAML
# https://taskfile.dev
|
|
|
|
version: "3"
|
|
|
|
tasks:
|
|
install-deps:
|
|
internal: true
|
|
dir: desktop/@wailsio/runtime
|
|
sources:
|
|
- package.json
|
|
cmds:
|
|
- npm install
|
|
|
|
check:
|
|
dir: desktop/@wailsio/runtime
|
|
deps:
|
|
- install-deps
|
|
cmds:
|
|
- npm run check
|
|
|
|
test:
|
|
dir: desktop/@wailsio/runtime
|
|
deps:
|
|
- install-deps
|
|
cmds:
|
|
- npm test
|
|
|
|
build:debug:
|
|
internal: true
|
|
cmds:
|
|
- npx esbuild@latest desktop/@wailsio/runtime/src/index.ts --inject:desktop/compiled/main.js --format=esm --target=safari11 --bundle --ignore-annotations --tree-shaking=true --sourcemap=inline --outfile=../assetserver/bundledassets/runtime.debug.js --define:DEBUG=true
|
|
|
|
build:production:
|
|
internal: true
|
|
cmds:
|
|
- npx esbuild@latest desktop/@wailsio/runtime/src/index.ts --inject:desktop/compiled/main.js --format=esm --target=safari11 --bundle --ignore-annotations --tree-shaking=true --minify --outfile=../assetserver/bundledassets/runtime.js --define:DEBUG=false --drop:console
|
|
|
|
build:docs:
|
|
internal: true
|
|
dir: desktop/@wailsio/runtime
|
|
deps:
|
|
- install-deps
|
|
cmds:
|
|
- npm run build:docs
|
|
|
|
build:docs:md:
|
|
internal: true
|
|
dir: desktop/@wailsio/runtime
|
|
deps:
|
|
- install-deps
|
|
cmds:
|
|
- npm run build:docs:md
|
|
|
|
build:runtime:
|
|
internal: true
|
|
deps:
|
|
- build:debug
|
|
- build:production
|
|
|
|
cmds:
|
|
- cmd: echo "Runtime build complete."
|
|
|
|
build:all:
|
|
internal: true
|
|
cmds:
|
|
- task: generate:events
|
|
- task: build:docs
|
|
- task: build:runtime
|
|
- echo "Build Complete."
|
|
|
|
build:
|
|
deps:
|
|
- install-deps
|
|
cmds:
|
|
- task: build:all
|
|
|
|
docs:
|
|
summary: Generate TypeDoc documentation for the runtime
|
|
dir: desktop/@wailsio/runtime
|
|
deps:
|
|
- install-deps
|
|
cmds:
|
|
- npm run build:docs
|
|
- echo "Documentation generated at desktop/@wailsio/runtime/docs/"
|
|
|
|
docs:md:
|
|
summary: Generate markdown documentation for the runtime
|
|
dir: desktop/@wailsio/runtime
|
|
deps:
|
|
- install-deps
|
|
cmds:
|
|
- npm run build:docs:md
|
|
- echo "Markdown documentation generated"
|
|
|
|
generate:events:
|
|
dir: ../../tasks/events
|
|
cmds:
|
|
- go run generate.go
|
|
- go fmt ../../pkg/events/events.go
|
|
|
|
clean:
|
|
summary: Clean built artifacts and documentation
|
|
dir: desktop/@wailsio/runtime
|
|
cmds:
|
|
- npm run clean
|
|
- echo "Cleaned runtime artifacts"
|
|
|
|
generate:
|
|
summary: Generate events only (use runtime:build to rebuild everything)
|
|
cmds:
|
|
- task: generate:events
|
|
- echo "Events generated. Run 'wails3 task runtime:build' to rebuild runtime with updated documentation"
|