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.
104 lines
2.4 KiB
Go
104 lines
2.4 KiB
Go
package application
|
|
|
|
import (
|
|
"unsafe"
|
|
|
|
"github.com/wailsapp/wails/v3/pkg/events"
|
|
)
|
|
|
|
type Window interface {
|
|
Center()
|
|
Close()
|
|
DisableSizeConstraints()
|
|
DispatchWailsEvent(event *CustomEvent)
|
|
EmitEvent(name string, data ...any) bool
|
|
EnableSizeConstraints()
|
|
Error(message string, args ...any)
|
|
ExecJS(js string)
|
|
Focus()
|
|
ForceReload()
|
|
Fullscreen() Window
|
|
GetBorderSizes() *LRTB
|
|
GetScreen() (*Screen, error)
|
|
GetZoom() float64
|
|
handleDragAndDropMessage(filenames []string, dropTarget *DropTargetDetails)
|
|
InitiateFrontendDropProcessing(filenames []string, x int, y int)
|
|
HandleMessage(message string)
|
|
HandleWindowEvent(id uint)
|
|
Height() int
|
|
Hide() Window
|
|
HideMenuBar()
|
|
ID() uint
|
|
Info(message string, args ...any)
|
|
IsFocused() bool
|
|
IsFullscreen() bool
|
|
IsIgnoreMouseEvents() bool
|
|
IsMaximised() bool
|
|
IsMinimised() bool
|
|
HandleKeyEvent(acceleratorString string)
|
|
Maximise() Window
|
|
Minimise() Window
|
|
Name() string
|
|
OnWindowEvent(eventType events.WindowEventType, callback func(event *WindowEvent)) func()
|
|
OpenContextMenu(data *ContextMenuData)
|
|
Position() (int, int)
|
|
RelativePosition() (int, int)
|
|
Reload()
|
|
Resizable() bool
|
|
Restore()
|
|
Run()
|
|
SetPosition(x, y int)
|
|
SetAlwaysOnTop(b bool) Window
|
|
SetBackgroundColour(colour RGBA) Window
|
|
SetFrameless(frameless bool) Window
|
|
SetHTML(html string) Window
|
|
SetMinimiseButtonState(state ButtonState) Window
|
|
SetMaximiseButtonState(state ButtonState) Window
|
|
SetCloseButtonState(state ButtonState) Window
|
|
SetMaxSize(maxWidth, maxHeight int) Window
|
|
SetMinSize(minWidth, minHeight int) Window
|
|
SetRelativePosition(x, y int) Window
|
|
SetResizable(b bool) Window
|
|
SetIgnoreMouseEvents(ignore bool) Window
|
|
SetSize(width, height int) Window
|
|
SetTitle(title string) Window
|
|
SetURL(s string) Window
|
|
SetZoom(magnification float64) Window
|
|
Show() Window
|
|
ShowMenuBar()
|
|
Size() (width int, height int)
|
|
OpenDevTools()
|
|
ToggleFullscreen()
|
|
ToggleMaximise()
|
|
ToggleMenuBar()
|
|
ToggleFrameless()
|
|
UnFullscreen()
|
|
UnMaximise()
|
|
UnMinimise()
|
|
Width() int
|
|
IsVisible() bool
|
|
Bounds() Rect
|
|
SetBounds(bounds Rect)
|
|
Zoom()
|
|
ZoomIn()
|
|
ZoomOut()
|
|
ZoomReset() Window
|
|
SetMenu(menu *Menu)
|
|
SnapAssist()
|
|
SetContentProtection(protection bool) Window
|
|
NativeWindow() unsafe.Pointer
|
|
SetEnabled(enabled bool)
|
|
Flash(enabled bool)
|
|
Print() error
|
|
RegisterHook(eventType events.WindowEventType, callback func(event *WindowEvent)) func()
|
|
shouldUnconditionallyClose() bool
|
|
|
|
// Editing methods
|
|
cut()
|
|
copy()
|
|
paste()
|
|
undo()
|
|
redo()
|
|
delete()
|
|
selectAll()
|
|
}
|