diff --git a/kittens/dnd/drop.go b/kittens/dnd/drop.go index 163841377..d17192d74 100644 --- a/kittens/dnd/drop.go +++ b/kittens/dnd/drop.go @@ -195,23 +195,16 @@ type drop_status struct { reading_data bool is_remote_client bool - root_remote_dir *remote_dir_entry - open_remote_dir *remote_dir_entry - current_remote_entry *remote_dir_entry // used for m=1 only - pending_remote_dirs []*remote_dir_entry - remote_dir_handle_counter int32 + root_remote_dir *remote_dir_entry + open_remote_dir *remote_dir_entry + current_remote_entry *remote_dir_entry // used for m=1 only + pending_remote_dirs []*remote_dir_entry } -func (d *drop_status) next_dir_handle() int32 { - d.remote_dir_handle_counter++ - for d.remote_dir_handle_counter == 0 || d.remote_dir_handle_counter == 1 { - d.remote_dir_handle_counter++ - } - return d.remote_dir_handle_counter +func (d *drop_status) reset() { + *d = drop_status{cell_x: -1, cell_y: -1} } -var reset_drop_status = drop_status{cell_x: -1, cell_y: -1} - func (root *remote_dir_entry) close_tree() { if root.base_dir != nil { root.base_dir = root.base_dir.unref() @@ -227,7 +220,7 @@ func (dnd *dnd) end_drop() { dnd.drop_status.root_remote_dir.close_tree() dnd.drop_status.root_remote_dir = nil } - dnd.drop_status = reset_drop_status + dnd.drop_status.reset() dnd.render_screen() } @@ -246,7 +239,7 @@ func (dnd *dnd) all_mime_data_dropped() (err error) { } } if len(drop_status.uri_list) == 0 { - *drop_status = reset_drop_status + dnd.drop_status.reset() dnd.data_has_been_dropped = true dnd.render_screen() return @@ -335,7 +328,7 @@ func (dnd *dnd) on_drop_move(cell_x, cell_y int, has_more bool, offered_mimes st } dnd.drop_status.in_window = cell_x > -1 && cell_y > -1 if !dnd.drop_status.in_window || dnd.drag_started { // disallow self drag and drop - dnd.drop_status = reset_drop_status + dnd.drop_status.reset() } mimes_changed := !slices.Equal(prev_status.accepted_mimes, dnd.drop_status.accepted_mimes) needs_rerender = prev_status.action != dnd.drop_status.action || mimes_changed diff --git a/kittens/dnd/main.go b/kittens/dnd/main.go index fcb59a9a9..4b9ca61b5 100644 --- a/kittens/dnd/main.go +++ b/kittens/dnd/main.go @@ -130,16 +130,16 @@ func (dnd *dnd) run_loop() (err error) { if dnd.lp, err = loop.New(); err != nil { return err } - dnd.drop_status = reset_drop_status + dnd.drop_status.reset() dnd.lp.OnInitialize = func() (string, error) { dnd.lp.AllowLineWrapping(false) dnd.lp.SetCursorVisible(false) if dnd.allow_drops { - dnd.lp.StartAcceptingDrops(dnd.opts.MachineId, slices.Collect(maps.Keys(dnd.drop_dests))...) + dnd.lp.StartAcceptingDrops("", slices.Collect(maps.Keys(dnd.drop_dests))...) } if dnd.allow_drags { - dnd.lp.StartOfferingDrags(dnd.opts.MachineId) + dnd.lp.StartOfferingDrags("") } dnd.lp.SetWindowTitle("Drag and drop") return "", dnd.render_screen() @@ -199,9 +199,24 @@ func (dnd *dnd) run_loop() (err error) { switch string(cmd.Payload) { case "PING": dnd.send_test_response("PONG") - case "SETUP": + case "SETUP_LOCAL", "SETUP_REMOTE": dnd.in_test_mode = true dnd.lp.NoRoundtripToTerminalOnExit() + dnd.drop_status.reset() + dnd.lp.StopAcceptingDrops() + dnd.lp.StopOfferingDrags() + machine_id := "" + if string(cmd.Payload) == "SETUP_REMOTE" { + machine_id = "remote-client-for-test" + } + if dnd.allow_drops { + dnd.lp.StartAcceptingDrops(machine_id, slices.Collect(maps.Keys(dnd.drop_dests))...) + } + if dnd.allow_drags { + dnd.lp.StartOfferingDrags(machine_id) + } + dnd.render_screen() + dnd.send_test_response("SETUP_DONE") case "GEOMETRY": dnd.send_test_response(fmt.Sprintf("GEOMETRY:%d:%d:%d:%d:%d:%d:%d:%d", dnd.copy_button_region.left, dnd.copy_button_region.top, dnd.copy_button_region.width, dnd.copy_button_region.height, dnd.move_button_region.left, dnd.move_button_region.top, dnd.move_button_region.width, dnd.move_button_region.height)) case "DROP_MIMES": diff --git a/kittens/dnd/main.py b/kittens/dnd/main.py index 1f0cdf803..3e675f53a 100644 --- a/kittens/dnd/main.py +++ b/kittens/dnd/main.py @@ -33,12 +33,9 @@ default=disallowed type=choices Allow dropping anywhere, not just on the Copy or Move drop regions. Dropping anywhere will perform the specified action. - - ---machine-id -The machine id to use instead of the actual machine id. '''.format + help_text = '''\ Perform drag and drop operations, even over SSH. diff --git a/kitty_tests/dnd_kitten.py b/kitty_tests/dnd_kitten.py index 9fc796d93..14e4b9f3a 100644 --- a/kitty_tests/dnd_kitten.py +++ b/kitty_tests/dnd_kitten.py @@ -116,19 +116,17 @@ class TestDnDKitten(BaseTest): def finish_setup(self, remote_client: bool = False, cli_args = ()): cmd = [kitten_exe(), 'dnd'] - if remote_client: - cmd.append('--machine-id=remote-client-for-test') cmd += list(cli_args) self.pty = self.enterContext(PTY(argv=cmd, cwd=self.kitten_wd, rows=25, columns=80, window_id=self.capture.window_id)) self.capture.pty = self.pty self.pty.callbacks.printbuf = self self.screen = self.pty.screen - self.pty.wait_till(lambda: bool(self.pty.callbacks.titlebuf)) + self.send_dnd_command_to_kitten('SETUP_REMOTE' if remote_client else 'SETUP_LOCAL') + self.wait_for_responses('SETUP_DONE') self.assertTrue(self.probe_state('drop_wanted')) self.assertEqual(remote_client, self.probe_state('drop_is_remote_client')) if self.probe_state('drag_can_offer'): self.assertEqual(remote_client, self.probe_state('drag_is_remote_client')) - self.send_dnd_command_to_kitten('SETUP') def get_button_geometry(self, are_present: bool = True): self.send_dnd_command_to_kitten('GEOMETRY')