fix: macOS player-swap deadlock, stray timeline view flash, CLI EOF exit#544
Merged
FelipeDefensor merged 7 commits intoJun 23, 2026
Merged
Conversation
If a TimelineUI has dialogs that open during the creation of the timeline, the un-parented TimelineView flashes temporarily while the dialog is shown. Setting the proxy earlier prevents this.
EOF on stdin is a normal termination signal - exit code 0 rather than 1. Update the CI smoke check to run the CLI so it exits immediately and cleanly without a misleading warning.
When swapping player types, the old widget's deleteLater() is not processed by processEvents() reliably on macOS. Use sendPostedEvents(None, DeferredDelete) instead to directly dispatch the deferred deletion before the new player is created. Updates the regression test to exercise the real production path: load local video, then load YouTube (which triggers the swap), and assert the update request reaches the new window without crashing.
Open
led to opening to a blank app without a slider tl
QtWebEngineProcess stays alive as an orphan on macOS after deleteLater() is called, preventing the pytest-xdist worker from exiting and hanging the CI job for 30 minutes. Navigate to about:blank and flush the Qt event queue after the module finishes so the engine cleans up before the worker exits.
c575648 to
d3100be
Compare
| h = get(Get.TIMELINE, id).get_data("height") | ||
| scene = self.create_timeline_scene(id, w, h) | ||
| view = self.create_timeline_view(scene) | ||
| view.proxy = self.scene.addWidget(view) |
Collaborator
There was a problem hiding this comment.
Is preventing the flashing the only reason why we have the proxy? In any case, we should add a comment explaining its raison d'être.
Collaborator
|
LGTM, I just need to test this on my Mac before final approval. P.S.: Thank you for getting rid of the flashing. |
Collaborator
|
Can't test this thoroughly before solving #548. Will try to do that today. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
tilia/media/loader.py— When swapping player types, explicitly callQCoreApplication.sendPostedEvents(None, DeferredDelete). On macOS deferred deletions do not reliably flush (it can block on platform events first); the directsendPostedEventscall bypasses the platform dispatcher and ensures the old widget — particularlyQWebEngineView— is truly destroyed before the new player is created, preventing a macOS deadlock.tilia/ui/timelines/collection/collection.py— EmbedTimelineViewinto the scene before constructingTimelineUI. Prevents an un-parented view from flashing when a timeline's constructor opens a dialog.tilia/ui/cli/ui.py— Treat EOF on stdin as a clean exit (code 0) rather than an error. The CI smoke check now pipesabout+quitinto the CLI instead of using a background process, andQT_DEBUG_PLUGINSis scoped to the GUI launch only so plugin noise no longer interleaves with CLI output.