@@ -3,19 +3,19 @@ const Me = imports.misc.extensionUtils.getCurrentExtension();
33
44import * as arena from 'arena' ;
55import * as Ecs from 'ecs' ;
6+ import * as Fork from 'fork' ;
7+ import * as geom from 'geom' ;
68import * as Lib from 'lib' ;
79import * as log from 'log' ;
810import * as movement from 'movement' ;
9- import * as Rect from 'rectangle' ;
1011import * as Node from 'node' ;
11- import * as Fork from 'fork' ;
12- import * as geom from 'geom' ;
12+ import * as Rect from 'rectangle' ;
1313
1414import type { Entity } from 'ecs' ;
15- import type { Rectangle } from './rectangle' ;
16- import type { ShellWindow } from './window' ;
1715import type { Ext } from './extension' ;
16+ import type { Rectangle } from './rectangle' ;
1817import { Stack } from './stack' ;
18+ import type { ShellWindow } from './window' ;
1919
2020const { Arena } = arena ;
2121const { Meta } = imports . gi ;
@@ -350,7 +350,7 @@ export class Forest extends Ecs.World {
350350 }
351351
352352 /** Detaches an entity from the a fork, re-arranging the fork's tree as necessary */
353- detach ( ext : Ext , fork_entity : Entity , window : Entity ) : [ Entity , Fork . Fork ] | null {
353+ detach ( ext : Ext , fork_entity : Entity , window : Entity , destroy_stack : boolean = false ) : [ Entity , Fork . Fork ] | null {
354354 const fork = this . forks . get ( fork_entity ) ;
355355 if ( ! fork ) return null ;
356356
@@ -387,8 +387,11 @@ export class Forest extends Ecs.World {
387387 ext ,
388388 fork . left . inner as Node . NodeStack ,
389389 window ,
390- ( ) => {
391- if ( fork . right ) {
390+ destroy_stack ,
391+ ( window : undefined | Entity ) => {
392+ if ( window )
393+ fork . left = Node . Node . window ( window ) ;
394+ else if ( fork . right ) {
392395 fork . left = fork . right
393396 fork . right = null
394397 if ( parent ) {
@@ -428,9 +431,14 @@ export class Forest extends Ecs.World {
428431 ext ,
429432 fork . right . inner as Node . NodeStack ,
430433 window ,
431- ( ) => {
432- fork . right = null
434+ destroy_stack ,
435+ ( window ) => {
436+ if ( window )
437+ fork . right = Node . Node . window ( window ) ;
438+ else {
439+ fork . right = null ;
433440 this . reassign_to_parent ( fork , fork . left )
441+ }
434442 } ,
435443 ) ;
436444 }
@@ -714,7 +722,7 @@ export class Forest extends Ecs.World {
714722 }
715723
716724 /** Removes window from stack, destroying the stack if it was the last window. */
717- private remove_from_stack ( ext : Ext , stack : Node . NodeStack , window : Entity , on_last : ( ) => void ) {
725+ private remove_from_stack ( ext : Ext , stack : Node . NodeStack , window : Entity , destroy_stack : boolean , on_last : ( win ?: Entity ) => void ) {
718726 if ( stack . entities . length === 1 ) {
719727 this . stacks . remove ( stack . idx ) ?. destroy ( ) ;
720728 on_last ( ) ;
@@ -723,6 +731,10 @@ export class Forest extends Ecs.World {
723731 if ( s ) {
724732 Node . stack_remove ( this , stack , window )
725733 }
734+ if ( destroy_stack && stack . entities . length === 1 ) {
735+ on_last ( stack . entities [ 0 ] )
736+ this . stacks . remove ( stack . idx ) ?. destroy ( )
737+ }
726738 }
727739
728740 const win = ext . windows . get ( window ) ;
0 commit comments