fix: zombie terminals eating the quota; tab drop double-firing into two panes
- The per-session terminal quota counted exited zombie handles (shells closed or dropped on hosts without the close-frame protocol), so enough abandoned terminals permanently blocked new ones — the 'disconnected, reconnecting' loop. open() now sweeps the session's exited handles before the quota check, and the running instance's leftovers disappear on the next restart (disposeAll). - Dragging a tab onto the strip's background fired the drop TWICE: the TabBar handled it (merge into this pane) and the event bubbled to the pane root, which ran its edge-zone handler again — producing two splits / a duplicated instance (up+down). The strip now stops propagation for drag-over and drop. - Tests: +1 real-pty smoke (exited handle swept, new tab spawns under a quota of 1).
This commit is contained in:
@@ -64,12 +64,17 @@ export function TabBar(props: {
|
||||
<div
|
||||
className={clsx(css.tabBar, dragOver && css.tabBarDrop)}
|
||||
onDragOver={(event) => {
|
||||
// The strip owns drops on itself (merge into this pane); stopping
|
||||
// propagation keeps the pane root from also running its edge-zone
|
||||
// handler on the same drop.
|
||||
event.preventDefault()
|
||||
event.stopPropagation()
|
||||
setDragOver(true)
|
||||
}}
|
||||
onDragLeave={() => { setDragOver(false) }}
|
||||
onDrop={(event) => {
|
||||
event.preventDefault()
|
||||
event.stopPropagation()
|
||||
setDragOver(false)
|
||||
const raw = event.dataTransfer.getData(TAB_DRAG_TYPE)
|
||||
const payload = parseDrag(raw)
|
||||
|
||||
Reference in New Issue
Block a user