zntg/addons/drop/drop_windows.go

71 lines
1.4 KiB
Go

// +build windows
package drop
import (
"errors"
"unsafe"
"golang.org/x/text/encoding/unicode"
"opslag.de/schobers/geom"
)
/*
#include <Windows.h>
#include <stdint.h>
void SetDragAndDropHook(void* window);
*/
import "C"
var handler Dropper = nil
var drops map[uint32]droppedFiles = map[uint32]droppedFiles{}
type droppedFiles struct {
X, Y int
Files []string
}
//export droppedFilesPosition
func droppedFilesPosition(id C.uint32_t, x, y C.INT) {
files := drops[uint32(id)]
files.X = int(x)
files.Y = int(y)
drops[uint32(id)] = files
}
//export droppedFilesFile
func droppedFilesFile(id C.uint32_t, filePath *C.wchar_t, filePathLength C.UINT) {
files := drops[uint32(id)]
pathBytes := C.GoBytes(unsafe.Pointer(filePath), C.int(filePathLength)*C.sizeof_wchar_t)
decoder := unicode.UTF16(unicode.LittleEndian, unicode.UseBOM).NewDecoder()
path, err := decoder.Bytes(pathBytes)
if err != nil {
return
}
files.Files = append(files.Files, string(path))
drops[uint32(id)] = files
}
//export droppedFilesDrop
func droppedFilesDrop(id C.uint32_t) {
h := handler
if h == nil {
return
}
drop, ok := drops[uint32(id)]
if !ok {
return
}
h.FilesDropped(geom.Pt(drop.X, drop.Y).ToF32(), drop.Files)
}
func Register(dropper Dropper) error {
if handler != nil {
return errors.New(`can only register single dropper`)
}
handler = dropper
C.SetDragAndDropHook(unsafe.Pointer(dropper.WindowHandle()))
return nil
}