Sunday, September 20, 2026
1 change · master
Resolved issues and error corrections
Discuss calls now keep participant video tiles stable when the layout changes, preventing videos from restarting or glitching. The call interface also adapts better to speakers, presenters, small screens, and resized windows for a more polished meeting experience.
Original PR description
Before this commit, the call view arranged its cards by rewriting CSS variables. Cards jumped to their new place instead of moving to it, and a rearrangement recreated their elements, so a video…
Before this commit, the call view arranged its cards by rewriting CSS variables. Cards jumped to their new place instead of moving to it, and a rearrangement recreated their elements, so a video glitched and restarted from scratch on every layout change. This commit fixes the issue by computing the rendering outside the component, around three concepts: - the "stage" is the one area a call renders into, shared by the tile grid, the sidebar that reserves its room out of the grid's, and the inset overlaying the first tile; - a "surface" is one entry of that stage, held by a stable identity rather than by its position, so a layout change moves it, media and all, instead of recreating it; - a "profile" is the set of layout knobs a call resolves to, one per place it renders in: Discuss, meeting, chat window, PiP and phone. Four modules carry them: 1. `call_profile.js` resolves the call into a `CallProfile`, the knobs everything else runs on: adding a profile is a new `CALL_PROFILE_TYPE` and a new case, never a branch elsewhere. 2. `stage/surface_manager.js` reconciles the desired surfaces with the live ones, so a video travels grid <-> sidebar <-> spotlight without being torn down. 3. `stage/layout_engine.js` turns the profile, the measured stage and the desired surfaces into rectangles. Deterministic and side-effect free. 4. `stage/geometry_renderer.js` applies those rectangles through the Web Animations API, outside the render loop, so surfaces move on the compositor instead of jumping. This commit also makes these miscellaneous changes: - the spotlight splits its stage between the recent speakers, kept 3s after they stop talking, instead of swapping on every sentence; - cards are ordered by what the stage must not hide: presenters, then speakers in the order they took the floor, then self; - the inset snaps to the nearest corner, stored as a corner rather than pixels, so it survives a resize; - on a small screen the call bar folds everything but the microphone, the camera and their settings into one "More" menu; - "Switch Camera" moves into the quick video settings; - in a chat window, the fullscreen button no longer pulses to nudge the user into it when another participant turns their camera on. task-4781315 Forward-Port-Of: odoo/odoo#282766