mirror of
https://github.com/kovidgoyal/kitty
synced 2026-06-08 22:28:24 +02:00
73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
package dnd
|
|
|
|
import (
|
|
"fmt"
|
|
"maps"
|
|
"slices"
|
|
"strings"
|
|
|
|
"github.com/kovidgoyal/kitty/tools/utils"
|
|
)
|
|
|
|
var _ = fmt.Print
|
|
|
|
type drag_status struct {
|
|
active bool
|
|
terminal_accepted_drag bool
|
|
}
|
|
|
|
func (dnd *dnd) on_potential_drag_start(cell_x, cell_y int) (err error) {
|
|
if !dnd.allow_drags || dnd.drag_status.active {
|
|
return
|
|
}
|
|
mimes := slices.Collect(maps.Keys(dnd.drag_sources))
|
|
actions := 3
|
|
if dnd.copy_button_region.has(cell_x, cell_y) {
|
|
actions = 1
|
|
} else if dnd.move_button_region.has(cell_x, cell_y) {
|
|
actions = 2
|
|
}
|
|
dnd.lp.QueueDnDData(DC{Type: 'o', Operation: actions, Payload: utils.UnsafeStringToBytes(strings.Join(mimes, " "))})
|
|
total_preloaded_data_sz := 0
|
|
for i, mt := range mimes {
|
|
s := dnd.drag_sources[mt]
|
|
if len(s.data) > 0 && len(s.data)+total_preloaded_data_sz < 64*1024*1024 {
|
|
total_preloaded_data_sz += len(s.data)
|
|
dnd.lp.QueueDnDData(DC{Type: 'p', X: i, Operation: actions, Payload: s.data})
|
|
dnd.lp.QueueDnDData(DC{Type: 'p', X: i, Operation: actions})
|
|
}
|
|
}
|
|
// TODO: set the drag image
|
|
dnd.lp.QueueDnDData(DC{Type: 'P', X: -1}) // start drag
|
|
dnd.drag_status.active = true
|
|
|
|
return dnd.render_screen()
|
|
}
|
|
|
|
func (dnd *dnd) on_drag_error(cmd DC) (err error) {
|
|
payload := string(cmd.Payload)
|
|
switch payload {
|
|
case "OK":
|
|
if dnd.drag_status.active && !dnd.drag_status.terminal_accepted_drag {
|
|
dnd.drag_status.terminal_accepted_drag = true
|
|
err = dnd.render_screen()
|
|
}
|
|
default:
|
|
err = fmt.Errorf("terminal responded with drag source error: %s", payload)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (dnd *dnd) reset_drag() {
|
|
dnd.drag_status = drag_status{}
|
|
}
|
|
|
|
func (dnd *dnd) on_drag_event(x, y int) (err error) {
|
|
switch x {
|
|
case 4:
|
|
dnd.reset_drag()
|
|
return dnd.render_screen()
|
|
}
|
|
return
|
|
}
|