diff options
| author | Adam Malczewski <[email protected]> | 2026-06-29 18:02:47 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-29 18:02:47 +0900 |
| commit | 18a718fdd2239b6c3dc497f472a85c8612d0115c (patch) | |
| tree | 4526c2c8fa9086d92d104c7324eb09c70d27435b | |
| parent | cfcdda455e92fe9ce484e242a1a918403392fbb4 (diff) | |
| download | study-player-18a718fdd2239b6c3dc497f472a85c8612d0115c.tar.gz study-player-18a718fdd2239b6c3dc497f472a85c8612d0115c.zip | |
fix: poll drag-and-drop in the main loop (drop events were never read)
Root cause: the file-drop check was a flecs system registered with
with: [] (zero terms). In this flecs build a zero-term system never
iterates its block, so Rl.file_dropped? was never polled and dropped
files were silently ignored -- the SDL backend was receiving the Xdnd
events fine all along.
Moved the IsFileDropped()/LoadDroppedFiles() check into the main loop
(before world.progress, so the LoadSystem picks up the file the same
frame), matching the original C study-player. Verified end-to-end with a
synthetic Xdnd drop: file detected -> loaded as a music stream.
| -rw-r--r-- | game/study_player/study_player.rb | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/game/study_player/study_player.rb b/game/study_player/study_player.rb index 82d0606..8b6997b 100644 --- a/game/study_player/study_player.rb +++ b/game/study_player/study_player.rb @@ -1474,21 +1474,11 @@ module StudyPlayer UpdateSystem.build(world, player_entity, runtime, pb) StudySystem.build(world, player_entity, runtime, pb, ss) - # --- File drop check system (drag-and-drop fallback) --- - world.system("CheckFileDrop", with: [], phase: Flecs::PRE_UPDATE) do - if Rl.file_dropped? - files = Rl.load_dropped_files - if files && files.count > 0 - path = files.path_at(0) - if path && !path.empty? - ent = player_entity - ent.set(af, { path: path, duration: 0.0 }) - ent.add(nl) - end - end - Rl.unload_dropped_files(files) - end - end + # NOTE: File-drop polling happens in the main loop below (not a flecs + # system). A system registered with `with: []` (zero terms) never iterates + # its block in this flecs build, so Rl.file_dropped? was never polled and + # drag-and-drop silently did nothing. The original C app polls + # IsFileDropped() directly in its main loop — same pattern here. # --- Audio file from ARGV (Phase 2: opens straight into player view) --- audio_arg = nil @@ -1522,6 +1512,22 @@ module StudyPlayer runtime.settings_visible = !runtime.settings_visible end + # --- Drag-and-drop file loading (polled in the main loop) --- + # Done before world.progress so the LoadSystem (PRE_UPDATE) picks up the + # new file in the same frame. + if Rl.file_dropped? + files = Rl.load_dropped_files + if files && files.count > 0 + path = files.path_at(0) + if path && !path.empty? + player_entity.set(af, { path: path, duration: 0.0 }) + player_entity.add(nl) + puts "[drag-drop] loading: #{path}" + end + end + Rl.unload_dropped_files(files) + end + # Run ECS systems (keyboard input, seek, update, study) world.progress(dt) |
