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 }