mirror of
https://github.com/wailsapp/wails.git
synced 2026-03-18 08:29:55 +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.
235 lines
6.1 KiB
Text
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!
|