wails/v3/pkg/events/events.txt
Lea Anthony 53c2275fea
fix(v3): overhaul drag-and-drop for Linux reliability and simplify Windows implementation (#4848)
* fix(v3): overhaul drag-and-drop for Linux reliability and simplify Windows

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

* fix(v3): address CodeRabbit review feedback

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

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

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

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

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

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

Remove stale TODO - enableFileDrop flag is now injected in navigationCompleted

* refactor(v3): make handleDragAndDropMessage unexported

Internal method only called by application event loop, not part of public API.
2026-01-04 11:08:29 +11:00

235 lines
6.1 KiB
Text

common:ApplicationOpenedWithFile
common:ApplicationStarted
common:ApplicationLaunchedWithUrl
common:ThemeChanged
common:WindowClosing
common:WindowDidMove
common:WindowDidResize
common:WindowDPIChanged
common:WindowFilesDropped
common:WindowFocus
common:WindowFullscreen
common:WindowHide
common:WindowLostFocus
common:WindowMaximise
common:WindowMinimise
common:WindowToggleFrameless
common:WindowRestore
common:WindowRuntimeReady
common:WindowShow
common:WindowUnFullscreen
common:WindowUnMaximise
common:WindowUnMinimise
common:WindowZoom
common:WindowZoomIn
common:WindowZoomOut
common:WindowZoomReset
linux:ApplicationStartup
linux:SystemThemeChanged
linux:WindowDeleteEvent
linux:WindowDidMove
linux:WindowDidResize
linux:WindowFocusIn
linux:WindowFocusOut
linux:WindowLoadStarted
linux:WindowLoadRedirected
linux:WindowLoadCommitted
linux:WindowLoadFinished
mac:ApplicationDidBecomeActive
mac:ApplicationDidChangeBackingProperties
mac:ApplicationDidChangeEffectiveAppearance
mac:ApplicationDidChangeIcon
mac:ApplicationDidChangeOcclusionState
mac:ApplicationDidChangeScreenParameters
mac:ApplicationDidChangeStatusBarFrame
mac:ApplicationDidChangeStatusBarOrientation
mac:ApplicationDidChangeTheme!
mac:ApplicationDidFinishLaunching
mac:ApplicationDidHide
mac:ApplicationDidResignActive
mac:ApplicationDidUnhide
mac:ApplicationDidUpdate
mac:ApplicationShouldHandleReopen!
mac:ApplicationWillBecomeActive
mac:ApplicationWillFinishLaunching
mac:ApplicationWillHide
mac:ApplicationWillResignActive
mac:ApplicationWillTerminate
mac:ApplicationWillUnhide
mac:ApplicationWillUpdate
mac:MenuDidAddItem
mac:MenuDidBeginTracking
mac:MenuDidClose
mac:MenuDidDisplayItem
mac:MenuDidEndTracking
mac:MenuDidHighlightItem
mac:MenuDidOpen
mac:MenuDidPopUp
mac:MenuDidRemoveItem
mac:MenuDidSendAction
mac:MenuDidSendActionToItem
mac:MenuDidUpdate
mac:MenuWillAddItem
mac:MenuWillBeginTracking
mac:MenuWillDisplayItem
mac:MenuWillEndTracking
mac:MenuWillHighlightItem
mac:MenuWillOpen
mac:MenuWillPopUp
mac:MenuWillRemoveItem
mac:MenuWillSendAction
mac:MenuWillSendActionToItem
mac:MenuWillUpdate
mac:WebViewDidCommitNavigation
mac:WebViewDidFinishNavigation
mac:WebViewDidReceiveServerRedirectForProvisionalNavigation
mac:WebViewDidStartProvisionalNavigation
mac:WindowDidBecomeKey
mac:WindowDidBecomeMain
mac:WindowDidBeginSheet
mac:WindowDidChangeAlpha
mac:WindowDidChangeBackingLocation
mac:WindowDidChangeBackingProperties
mac:WindowDidChangeCollectionBehavior
mac:WindowDidChangeEffectiveAppearance
mac:WindowDidChangeOcclusionState
mac:WindowDidChangeOrderingMode
mac:WindowDidChangeScreen
mac:WindowDidChangeScreenParameters
mac:WindowDidChangeScreenProfile
mac:WindowDidChangeScreenSpace
mac:WindowDidChangeScreenSpaceProperties
mac:WindowDidChangeSharingType
mac:WindowDidChangeSpace
mac:WindowDidChangeSpaceOrderingMode
mac:WindowDidChangeTitle
mac:WindowDidChangeToolbar
mac:WindowDidDeminiaturize
mac:WindowDidEndSheet
mac:WindowDidEnterFullScreen
mac:WindowDidEnterVersionBrowser
mac:WindowDidExitFullScreen
mac:WindowDidExitVersionBrowser
mac:WindowDidExpose
mac:WindowDidFocus
mac:WindowDidMiniaturize
mac:WindowDidMove
mac:WindowDidOrderOffScreen
mac:WindowDidOrderOnScreen
mac:WindowDidResignKey
mac:WindowDidResignMain
mac:WindowDidResize
mac:WindowDidUpdate
mac:WindowDidUpdateAlpha
mac:WindowDidUpdateCollectionBehavior
mac:WindowDidUpdateCollectionProperties
mac:WindowDidUpdateShadow
mac:WindowDidUpdateTitle
mac:WindowDidUpdateToolbar
mac:WindowDidZoom!
mac:WindowFileDraggingEntered
mac:WindowFileDraggingExited
mac:WindowFileDraggingPerformed
mac:WindowHide
mac:WindowMaximise!
mac:WindowUnMaximise!
mac:WindowMinimise!
mac:WindowUnMinimise!
mac:WindowShouldClose!
mac:WindowShow
mac:WindowWillBecomeKey
mac:WindowWillBecomeMain
mac:WindowWillBeginSheet
mac:WindowWillChangeOrderingMode
mac:WindowWillClose
mac:WindowWillDeminiaturize
mac:WindowWillEnterFullScreen
mac:WindowWillEnterVersionBrowser
mac:WindowWillExitFullScreen
mac:WindowWillExitVersionBrowser
mac:WindowWillFocus
mac:WindowWillMiniaturize
mac:WindowWillMove
mac:WindowWillOrderOffScreen
mac:WindowWillOrderOnScreen
mac:WindowWillResignMain
mac:WindowWillResize
mac:WindowWillUnfocus
mac:WindowWillUpdate
mac:WindowWillUpdateAlpha
mac:WindowWillUpdateCollectionBehavior
mac:WindowWillUpdateCollectionProperties
mac:WindowWillUpdateShadow
mac:WindowWillUpdateTitle
mac:WindowWillUpdateToolbar
mac:WindowWillUpdateVisibility
mac:WindowWillUseStandardFrame
mac:WindowZoomIn!
mac:WindowZoomOut!
mac:WindowZoomReset!
windows:APMPowerSettingChange
windows:APMPowerStatusChange
windows:APMResumeAutomatic
windows:APMResumeSuspend
windows:APMSuspend
windows:ApplicationStarted
windows:SystemThemeChanged
windows:WebViewNavigationCompleted
windows:WindowActive
windows:WindowBackgroundErase
windows:WindowClickActive
windows:WindowClosing
windows:WindowDidMove
windows:WindowDidResize
windows:WindowDPIChanged
windows:WindowDragDrop
windows:WindowDragEnter
windows:WindowDragLeave
windows:WindowDragOver
windows:WindowEndMove
windows:WindowEndResize
windows:WindowFullscreen
windows:WindowHide
windows:WindowInactive
windows:WindowKeyDown
windows:WindowKeyUp
windows:WindowKillFocus
windows:WindowNonClientHit
windows:WindowNonClientMouseDown
windows:WindowNonClientMouseLeave
windows:WindowNonClientMouseMove
windows:WindowNonClientMouseUp
windows:WindowPaint
windows:WindowRestore
windows:WindowSetFocus
windows:WindowShow
windows:WindowStartMove
windows:WindowStartResize
windows:WindowUnFullscreen
windows:WindowZOrderChanged
windows:WindowMinimise
windows:WindowUnMinimise
windows:WindowMaximise
windows:WindowUnMaximise
ios:ApplicationDidBecomeActive
ios:ApplicationDidEnterBackground
ios:ApplicationDidFinishLaunching
ios:ApplicationDidReceiveMemoryWarning
ios:ApplicationWillEnterForeground
ios:ApplicationWillResignActive
ios:ApplicationWillTerminate
ios:WindowDidLoad
ios:WindowWillAppear
ios:WindowDidAppear
ios:WindowWillDisappear
ios:WindowDidDisappear
ios:WindowSafeAreaInsetsChanged
ios:WindowOrientationChanged
ios:WindowTouchBegan
ios:WindowTouchMoved
ios:WindowTouchEnded
ios:WindowTouchCancelled
ios:WebViewDidStartNavigation
ios:WebViewDidFinishNavigation
ios:WebViewDidFailNavigation
ios:WebViewDecidePolicyForNavigationAction!