Compare commits
1 Commits
feat/tabbe
...
795d4d5508
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
795d4d5508 |
@@ -19,15 +19,10 @@ export default class aerospike extends Extension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enable() {
|
enable() {
|
||||||
try {
|
|
||||||
Logger.log("STARTING AEROSPIKE!")
|
Logger.log("STARTING AEROSPIKE!")
|
||||||
this.bindSettings();
|
this.bindSettings();
|
||||||
this.setupKeybindings();
|
this.setupKeybindings();
|
||||||
this.windowManager.enable()
|
this.windowManager.enable()
|
||||||
Logger.log("AEROSPIKE ENABLED SUCCESSFULLY")
|
|
||||||
} catch (e) {
|
|
||||||
Logger.error("AEROSPIKE ENABLE FAILED", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
disable() {
|
disable() {
|
||||||
@@ -44,7 +39,6 @@ export default class aerospike extends Extension {
|
|||||||
'print-tree': () => { this.windowManager.printTreeStructure(); },
|
'print-tree': () => { this.windowManager.printTreeStructure(); },
|
||||||
'toggle-orientation': () => { this.windowManager.toggleActiveContainerOrientation(); },
|
'toggle-orientation': () => { this.windowManager.toggleActiveContainerOrientation(); },
|
||||||
'reset-ratios': () => { this.windowManager.resetActiveContainerRatios(); },
|
'reset-ratios': () => { this.windowManager.resetActiveContainerRatios(); },
|
||||||
'toggle-tabbed': () => { this.windowManager.toggleActiveContainerTabbed(); },
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"@girs/gnome-shell": "49.1.0",
|
"@girs/gnome-shell": "49.1.0",
|
||||||
"@jest/globals": "^30.0.0",
|
"@jest/globals": "^30.0.0",
|
||||||
"@types/jest": "^30.0.0",
|
"@types/jest": "^30.0.0",
|
||||||
"eslint": "^10.0.0",
|
"eslint": "^9.36.0",
|
||||||
"eslint-plugin-jsdoc": "^62.0.0",
|
"eslint-plugin-jsdoc": "^62.0.0",
|
||||||
"jest": "^30.0.0",
|
"jest": "^30.0.0",
|
||||||
"ts-jest": "^29.1.2",
|
"ts-jest": "^29.1.2",
|
||||||
|
|||||||
296
pnpm-lock.yaml
generated
296
pnpm-lock.yaml
generated
@@ -43,11 +43,11 @@ importers:
|
|||||||
specifier: ^30.0.0
|
specifier: ^30.0.0
|
||||||
version: 30.0.0
|
version: 30.0.0
|
||||||
eslint:
|
eslint:
|
||||||
specifier: ^10.0.0
|
specifier: ^9.36.0
|
||||||
version: 10.0.0
|
version: 9.39.2
|
||||||
eslint-plugin-jsdoc:
|
eslint-plugin-jsdoc:
|
||||||
specifier: ^62.0.0
|
specifier: ^62.0.0
|
||||||
version: 62.4.1(eslint@10.0.0)
|
version: 62.7.0(eslint@9.39.2)
|
||||||
jest:
|
jest:
|
||||||
specifier: ^30.0.0
|
specifier: ^30.0.0
|
||||||
version: 30.2.0(@types/node@25.1.0)
|
version: 30.2.0(@types/node@25.1.0)
|
||||||
@@ -234,8 +234,8 @@ packages:
|
|||||||
'@emnapi/wasi-threads@1.1.0':
|
'@emnapi/wasi-threads@1.1.0':
|
||||||
resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
|
resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
|
||||||
|
|
||||||
'@es-joy/jsdoccomment@0.83.0':
|
'@es-joy/jsdoccomment@0.84.0':
|
||||||
resolution: {integrity: sha512-e1MHSEPJ4m35zkBvNT6kcdeH1SvMaJDsPC3Xhfseg3hvF50FUE3f46Yn36jgbrPYYXezlWUQnevv23c+lx2MCA==}
|
resolution: {integrity: sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
||||||
|
|
||||||
'@es-joy/resolve.exports@1.2.0':
|
'@es-joy/resolve.exports@1.2.0':
|
||||||
@@ -252,25 +252,33 @@ packages:
|
|||||||
resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
|
resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
|
||||||
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
|
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
|
||||||
|
|
||||||
'@eslint/config-array@0.23.0':
|
'@eslint/config-array@0.21.1':
|
||||||
resolution: {integrity: sha512-T5Swqd+PZxBekRuMsIFCySM3NUE8GjuqyksIIsXgkF2GCuiDaqpxKyPkv9VMEKpq5D7r5DLss1tM8tCsvRSjeg==}
|
resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@eslint/config-helpers@0.5.2':
|
'@eslint/config-helpers@0.4.2':
|
||||||
resolution: {integrity: sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==}
|
resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@eslint/core@1.1.0':
|
'@eslint/core@0.17.0':
|
||||||
resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==}
|
resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@eslint/object-schema@3.0.0':
|
'@eslint/eslintrc@3.3.3':
|
||||||
resolution: {integrity: sha512-nWl20RtHQP2A2yvKU6Fee62Xo1AoNRqBLixtyg45zJhU8ljPFCyBK90d8e8XTnPns1RggSf4HH3bM8AhevkPVg==}
|
resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@eslint/plugin-kit@0.6.0':
|
'@eslint/js@9.39.2':
|
||||||
resolution: {integrity: sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==}
|
resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
|
'@eslint/object-schema@2.1.7':
|
||||||
|
resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
|
||||||
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
|
'@eslint/plugin-kit@0.4.1':
|
||||||
|
resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
|
||||||
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@girs/accountsservice-1.0@1.0.0-4.0.0-beta.38':
|
'@girs/accountsservice-1.0@1.0.0-4.0.0-beta.38':
|
||||||
resolution: {integrity: sha512-6QzytM5dztmMynF2bxN73EuNK9ArMFxkP2L8wUC7IH45zBeBOfYcqL85BFh2PmkGmqRk+Rli5EFR8dAkx3Ig5Q==}
|
resolution: {integrity: sha512-6QzytM5dztmMynF2bxN73EuNK9ArMFxkP2L8wUC7IH45zBeBOfYcqL85BFh2PmkGmqRk+Rli5EFR8dAkx3Ig5Q==}
|
||||||
@@ -417,14 +425,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
|
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
|
||||||
engines: {node: '>=18.18'}
|
engines: {node: '>=18.18'}
|
||||||
|
|
||||||
'@isaacs/balanced-match@4.0.1':
|
|
||||||
resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
|
|
||||||
engines: {node: 20 || >=22}
|
|
||||||
|
|
||||||
'@isaacs/brace-expansion@5.0.1':
|
|
||||||
resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==}
|
|
||||||
engines: {node: 20 || >=22}
|
|
||||||
|
|
||||||
'@isaacs/cliui@8.0.2':
|
'@isaacs/cliui@8.0.2':
|
||||||
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
|
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
@@ -574,9 +574,6 @@ packages:
|
|||||||
'@types/babel__traverse@7.28.0':
|
'@types/babel__traverse@7.28.0':
|
||||||
resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
|
resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
|
||||||
|
|
||||||
'@types/esrecurse@4.3.1':
|
|
||||||
resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==}
|
|
||||||
|
|
||||||
'@types/estree@1.0.8':
|
'@types/estree@1.0.8':
|
||||||
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
|
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
|
||||||
|
|
||||||
@@ -607,8 +604,8 @@ packages:
|
|||||||
'@types/yargs@17.0.35':
|
'@types/yargs@17.0.35':
|
||||||
resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==}
|
resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==}
|
||||||
|
|
||||||
'@typescript-eslint/types@8.54.0':
|
'@typescript-eslint/types@8.56.1':
|
||||||
resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==}
|
resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@ungap/structured-clone@1.3.0':
|
'@ungap/structured-clone@1.3.0':
|
||||||
@@ -727,6 +724,11 @@ packages:
|
|||||||
engines: {node: '>=0.4.0'}
|
engines: {node: '>=0.4.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
acorn@8.16.0:
|
||||||
|
resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
|
||||||
|
engines: {node: '>=0.4.0'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
ajv@6.12.6:
|
ajv@6.12.6:
|
||||||
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
|
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
|
||||||
|
|
||||||
@@ -765,6 +767,9 @@ packages:
|
|||||||
argparse@1.0.10:
|
argparse@1.0.10:
|
||||||
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
|
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
|
||||||
|
|
||||||
|
argparse@2.0.1:
|
||||||
|
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
|
||||||
|
|
||||||
babel-jest@30.2.0:
|
babel-jest@30.2.0:
|
||||||
resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==}
|
resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==}
|
||||||
engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
|
engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
|
||||||
@@ -943,27 +948,31 @@ packages:
|
|||||||
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
|
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
eslint-plugin-jsdoc@62.4.1:
|
eslint-plugin-jsdoc@62.7.0:
|
||||||
resolution: {integrity: sha512-HgX2iN4j104D/mCUqRbhtzSZbph+KO9jfMHiIJjJ19Q+IwLQ5Na2IqvOJYq4S+4kgvEk1w6KYF4vVus6H2wcHg==}
|
resolution: {integrity: sha512-jootujJOIGMkCLN+/WgDFKtaclCt2MEEy9cZ1RyK19Az1JvVI3awbeMXNlJ6y4h8RWIJpcXqmxsu4t9NThYbNw==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
|
eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0
|
||||||
|
|
||||||
eslint-scope@9.1.0:
|
eslint-scope@8.4.0:
|
||||||
resolution: {integrity: sha512-CkWE42hOJsNj9FJRaoMX9waUFYhqY4jmyLFdAdzZr6VaCg3ynLYx4WnOdkaIifGfH4gsUcBTn4OZbHXkpLD0FQ==}
|
resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
eslint-visitor-keys@3.4.3:
|
eslint-visitor-keys@3.4.3:
|
||||||
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
|
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
|
|
||||||
eslint-visitor-keys@5.0.0:
|
eslint-visitor-keys@4.2.1:
|
||||||
resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==}
|
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
|
||||||
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
|
eslint-visitor-keys@5.0.1:
|
||||||
|
resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
||||||
|
|
||||||
eslint@10.0.0:
|
eslint@9.39.2:
|
||||||
resolution: {integrity: sha512-O0piBKY36YSJhlFSG8p9VUdPV/SxxS4FYDWVpr/9GJuMaepzwlf4J8I4ov1b+ySQfDTPhc3DtLaxcT1fN0yqCg==}
|
resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
jiti: '*'
|
jiti: '*'
|
||||||
@@ -971,8 +980,12 @@ packages:
|
|||||||
jiti:
|
jiti:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
espree@11.1.0:
|
espree@10.4.0:
|
||||||
resolution: {integrity: sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==}
|
resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
|
||||||
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
|
espree@11.1.1:
|
||||||
|
resolution: {integrity: sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
||||||
|
|
||||||
esprima@4.0.1:
|
esprima@4.0.1:
|
||||||
@@ -1084,6 +1097,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
|
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
|
||||||
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
|
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
|
||||||
|
|
||||||
|
globals@14.0.0:
|
||||||
|
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
graceful-fs@4.2.11:
|
graceful-fs@4.2.11:
|
||||||
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
|
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
|
||||||
|
|
||||||
@@ -1110,6 +1127,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
|
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
|
||||||
engines: {node: '>= 4'}
|
engines: {node: '>= 4'}
|
||||||
|
|
||||||
|
import-fresh@3.3.1:
|
||||||
|
resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
import-local@3.2.0:
|
import-local@3.2.0:
|
||||||
resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
|
resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -1314,8 +1335,12 @@ packages:
|
|||||||
resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==}
|
resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
jsdoc-type-pratt-parser@7.1.0:
|
js-yaml@4.1.1:
|
||||||
resolution: {integrity: sha512-SX7q7XyCwzM/MEDCYz0l8GgGbJAACGFII9+WfNYr5SLEKukHWRy2Jk3iWRe7P+lpYJNs7oQ+OSei4JtKGUjd7A==}
|
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
|
jsdoc-type-pratt-parser@7.1.1:
|
||||||
|
resolution: {integrity: sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==}
|
||||||
engines: {node: '>=20.0.0'}
|
engines: {node: '>=20.0.0'}
|
||||||
|
|
||||||
jsesc@3.1.0:
|
jsesc@3.1.0:
|
||||||
@@ -1365,6 +1390,9 @@ packages:
|
|||||||
lodash.memoize@4.1.2:
|
lodash.memoize@4.1.2:
|
||||||
resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
|
resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
|
||||||
|
|
||||||
|
lodash.merge@4.6.2:
|
||||||
|
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
|
||||||
|
|
||||||
lru-cache@10.4.3:
|
lru-cache@10.4.3:
|
||||||
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
|
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
|
||||||
|
|
||||||
@@ -1392,10 +1420,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
minimatch@10.1.2:
|
|
||||||
resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==}
|
|
||||||
engines: {node: 20 || >=22}
|
|
||||||
|
|
||||||
minimatch@3.1.2:
|
minimatch@3.1.2:
|
||||||
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
|
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
|
||||||
|
|
||||||
@@ -1475,6 +1499,10 @@ packages:
|
|||||||
package-json-from-dist@1.0.1:
|
package-json-from-dist@1.0.1:
|
||||||
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
|
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
|
||||||
|
|
||||||
|
parent-module@1.0.1:
|
||||||
|
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
parse-imports-exports@0.2.4:
|
parse-imports-exports@0.2.4:
|
||||||
resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==}
|
resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==}
|
||||||
|
|
||||||
@@ -1550,6 +1578,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
|
resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
resolve-from@4.0.0:
|
||||||
|
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
|
||||||
|
engines: {node: '>=4'}
|
||||||
|
|
||||||
resolve-from@5.0.0:
|
resolve-from@5.0.0:
|
||||||
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
|
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -1563,6 +1595,11 @@ packages:
|
|||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
semver@7.7.4:
|
||||||
|
resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
shebang-command@2.0.0:
|
shebang-command@2.0.0:
|
||||||
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
|
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -1595,8 +1632,8 @@ packages:
|
|||||||
spdx-expression-parse@4.0.0:
|
spdx-expression-parse@4.0.0:
|
||||||
resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==}
|
resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==}
|
||||||
|
|
||||||
spdx-license-ids@3.0.22:
|
spdx-license-ids@3.0.23:
|
||||||
resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==}
|
resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==}
|
||||||
|
|
||||||
sprintf-js@1.0.3:
|
sprintf-js@1.0.3:
|
||||||
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
|
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
|
||||||
@@ -1995,44 +2032,60 @@ snapshots:
|
|||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@es-joy/jsdoccomment@0.83.0':
|
'@es-joy/jsdoccomment@0.84.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/estree': 1.0.8
|
'@types/estree': 1.0.8
|
||||||
'@typescript-eslint/types': 8.54.0
|
'@typescript-eslint/types': 8.56.1
|
||||||
comment-parser: 1.4.5
|
comment-parser: 1.4.5
|
||||||
esquery: 1.7.0
|
esquery: 1.7.0
|
||||||
jsdoc-type-pratt-parser: 7.1.0
|
jsdoc-type-pratt-parser: 7.1.1
|
||||||
|
|
||||||
'@es-joy/resolve.exports@1.2.0': {}
|
'@es-joy/resolve.exports@1.2.0': {}
|
||||||
|
|
||||||
'@eslint-community/eslint-utils@4.9.1(eslint@10.0.0)':
|
'@eslint-community/eslint-utils@4.9.1(eslint@9.39.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 10.0.0
|
eslint: 9.39.2
|
||||||
eslint-visitor-keys: 3.4.3
|
eslint-visitor-keys: 3.4.3
|
||||||
|
|
||||||
'@eslint-community/regexpp@4.12.2': {}
|
'@eslint-community/regexpp@4.12.2': {}
|
||||||
|
|
||||||
'@eslint/config-array@0.23.0':
|
'@eslint/config-array@0.21.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint/object-schema': 3.0.0
|
'@eslint/object-schema': 2.1.7
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
minimatch: 10.1.2
|
minimatch: 3.1.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@eslint/config-helpers@0.5.2':
|
'@eslint/config-helpers@0.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint/core': 1.1.0
|
'@eslint/core': 0.17.0
|
||||||
|
|
||||||
'@eslint/core@1.1.0':
|
'@eslint/core@0.17.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/json-schema': 7.0.15
|
'@types/json-schema': 7.0.15
|
||||||
|
|
||||||
'@eslint/object-schema@3.0.0': {}
|
'@eslint/eslintrc@3.3.3':
|
||||||
|
|
||||||
'@eslint/plugin-kit@0.6.0':
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint/core': 1.1.0
|
ajv: 6.12.6
|
||||||
|
debug: 4.4.3
|
||||||
|
espree: 10.4.0
|
||||||
|
globals: 14.0.0
|
||||||
|
ignore: 5.3.2
|
||||||
|
import-fresh: 3.3.1
|
||||||
|
js-yaml: 4.1.1
|
||||||
|
minimatch: 3.1.2
|
||||||
|
strip-json-comments: 3.1.1
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
|
'@eslint/js@9.39.2': {}
|
||||||
|
|
||||||
|
'@eslint/object-schema@2.1.7': {}
|
||||||
|
|
||||||
|
'@eslint/plugin-kit@0.4.1':
|
||||||
|
dependencies:
|
||||||
|
'@eslint/core': 0.17.0
|
||||||
levn: 0.4.1
|
levn: 0.4.1
|
||||||
|
|
||||||
'@girs/accountsservice-1.0@1.0.0-4.0.0-beta.38':
|
'@girs/accountsservice-1.0@1.0.0-4.0.0-beta.38':
|
||||||
@@ -2499,12 +2552,6 @@ snapshots:
|
|||||||
|
|
||||||
'@humanwhocodes/retry@0.4.3': {}
|
'@humanwhocodes/retry@0.4.3': {}
|
||||||
|
|
||||||
'@isaacs/balanced-match@4.0.1': {}
|
|
||||||
|
|
||||||
'@isaacs/brace-expansion@5.0.1':
|
|
||||||
dependencies:
|
|
||||||
'@isaacs/balanced-match': 4.0.1
|
|
||||||
|
|
||||||
'@isaacs/cliui@8.0.2':
|
'@isaacs/cliui@8.0.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
string-width: 5.1.2
|
string-width: 5.1.2
|
||||||
@@ -2772,8 +2819,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.28.6
|
'@babel/types': 7.28.6
|
||||||
|
|
||||||
'@types/esrecurse@4.3.1': {}
|
|
||||||
|
|
||||||
'@types/estree@1.0.8': {}
|
'@types/estree@1.0.8': {}
|
||||||
|
|
||||||
'@types/istanbul-lib-coverage@2.0.6': {}
|
'@types/istanbul-lib-coverage@2.0.6': {}
|
||||||
@@ -2805,7 +2850,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@types/yargs-parser': 21.0.3
|
'@types/yargs-parser': 21.0.3
|
||||||
|
|
||||||
'@typescript-eslint/types@8.54.0': {}
|
'@typescript-eslint/types@8.56.1': {}
|
||||||
|
|
||||||
'@ungap/structured-clone@1.3.0': {}
|
'@ungap/structured-clone@1.3.0': {}
|
||||||
|
|
||||||
@@ -2872,8 +2917,14 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
acorn: 8.15.0
|
acorn: 8.15.0
|
||||||
|
|
||||||
|
acorn-jsx@5.3.2(acorn@8.16.0):
|
||||||
|
dependencies:
|
||||||
|
acorn: 8.16.0
|
||||||
|
|
||||||
acorn@8.15.0: {}
|
acorn@8.15.0: {}
|
||||||
|
|
||||||
|
acorn@8.16.0: {}
|
||||||
|
|
||||||
ajv@6.12.6:
|
ajv@6.12.6:
|
||||||
dependencies:
|
dependencies:
|
||||||
fast-deep-equal: 3.1.3
|
fast-deep-equal: 3.1.3
|
||||||
@@ -2908,6 +2959,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
sprintf-js: 1.0.3
|
sprintf-js: 1.0.3
|
||||||
|
|
||||||
|
argparse@2.0.1: {}
|
||||||
|
|
||||||
babel-jest@30.2.0(@babel/core@7.28.6):
|
babel-jest@30.2.0(@babel/core@7.28.6):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.28.6
|
'@babel/core': 7.28.6
|
||||||
@@ -3074,56 +3127,59 @@ snapshots:
|
|||||||
|
|
||||||
escape-string-regexp@4.0.0: {}
|
escape-string-regexp@4.0.0: {}
|
||||||
|
|
||||||
eslint-plugin-jsdoc@62.4.1(eslint@10.0.0):
|
eslint-plugin-jsdoc@62.7.0(eslint@9.39.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@es-joy/jsdoccomment': 0.83.0
|
'@es-joy/jsdoccomment': 0.84.0
|
||||||
'@es-joy/resolve.exports': 1.2.0
|
'@es-joy/resolve.exports': 1.2.0
|
||||||
are-docs-informative: 0.0.2
|
are-docs-informative: 0.0.2
|
||||||
comment-parser: 1.4.5
|
comment-parser: 1.4.5
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
escape-string-regexp: 4.0.0
|
escape-string-regexp: 4.0.0
|
||||||
eslint: 10.0.0
|
eslint: 9.39.2
|
||||||
espree: 11.1.0
|
espree: 11.1.1
|
||||||
esquery: 1.7.0
|
esquery: 1.7.0
|
||||||
html-entities: 2.6.0
|
html-entities: 2.6.0
|
||||||
object-deep-merge: 2.0.0
|
object-deep-merge: 2.0.0
|
||||||
parse-imports-exports: 0.2.4
|
parse-imports-exports: 0.2.4
|
||||||
semver: 7.7.3
|
semver: 7.7.4
|
||||||
spdx-expression-parse: 4.0.0
|
spdx-expression-parse: 4.0.0
|
||||||
to-valid-identifier: 1.0.0
|
to-valid-identifier: 1.0.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-scope@9.1.0:
|
eslint-scope@8.4.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/esrecurse': 4.3.1
|
|
||||||
'@types/estree': 1.0.8
|
|
||||||
esrecurse: 4.3.0
|
esrecurse: 4.3.0
|
||||||
estraverse: 5.3.0
|
estraverse: 5.3.0
|
||||||
|
|
||||||
eslint-visitor-keys@3.4.3: {}
|
eslint-visitor-keys@3.4.3: {}
|
||||||
|
|
||||||
eslint-visitor-keys@5.0.0: {}
|
eslint-visitor-keys@4.2.1: {}
|
||||||
|
|
||||||
eslint@10.0.0:
|
eslint-visitor-keys@5.0.1: {}
|
||||||
|
|
||||||
|
eslint@9.39.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0)
|
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2)
|
||||||
'@eslint-community/regexpp': 4.12.2
|
'@eslint-community/regexpp': 4.12.2
|
||||||
'@eslint/config-array': 0.23.0
|
'@eslint/config-array': 0.21.1
|
||||||
'@eslint/config-helpers': 0.5.2
|
'@eslint/config-helpers': 0.4.2
|
||||||
'@eslint/core': 1.1.0
|
'@eslint/core': 0.17.0
|
||||||
'@eslint/plugin-kit': 0.6.0
|
'@eslint/eslintrc': 3.3.3
|
||||||
|
'@eslint/js': 9.39.2
|
||||||
|
'@eslint/plugin-kit': 0.4.1
|
||||||
'@humanfs/node': 0.16.7
|
'@humanfs/node': 0.16.7
|
||||||
'@humanwhocodes/module-importer': 1.0.1
|
'@humanwhocodes/module-importer': 1.0.1
|
||||||
'@humanwhocodes/retry': 0.4.3
|
'@humanwhocodes/retry': 0.4.3
|
||||||
'@types/estree': 1.0.8
|
'@types/estree': 1.0.8
|
||||||
ajv: 6.12.6
|
ajv: 6.12.6
|
||||||
|
chalk: 4.1.2
|
||||||
cross-spawn: 7.0.6
|
cross-spawn: 7.0.6
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
escape-string-regexp: 4.0.0
|
escape-string-regexp: 4.0.0
|
||||||
eslint-scope: 9.1.0
|
eslint-scope: 8.4.0
|
||||||
eslint-visitor-keys: 5.0.0
|
eslint-visitor-keys: 4.2.1
|
||||||
espree: 11.1.0
|
espree: 10.4.0
|
||||||
esquery: 1.7.0
|
esquery: 1.7.0
|
||||||
esutils: 2.0.3
|
esutils: 2.0.3
|
||||||
fast-deep-equal: 3.1.3
|
fast-deep-equal: 3.1.3
|
||||||
@@ -3134,17 +3190,24 @@ snapshots:
|
|||||||
imurmurhash: 0.1.4
|
imurmurhash: 0.1.4
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
json-stable-stringify-without-jsonify: 1.0.1
|
json-stable-stringify-without-jsonify: 1.0.1
|
||||||
minimatch: 10.1.2
|
lodash.merge: 4.6.2
|
||||||
|
minimatch: 3.1.2
|
||||||
natural-compare: 1.4.0
|
natural-compare: 1.4.0
|
||||||
optionator: 0.9.4
|
optionator: 0.9.4
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
espree@11.1.0:
|
espree@10.4.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
acorn: 8.15.0
|
acorn: 8.15.0
|
||||||
acorn-jsx: 5.3.2(acorn@8.15.0)
|
acorn-jsx: 5.3.2(acorn@8.15.0)
|
||||||
eslint-visitor-keys: 5.0.0
|
eslint-visitor-keys: 4.2.1
|
||||||
|
|
||||||
|
espree@11.1.1:
|
||||||
|
dependencies:
|
||||||
|
acorn: 8.16.0
|
||||||
|
acorn-jsx: 5.3.2(acorn@8.16.0)
|
||||||
|
eslint-visitor-keys: 5.0.1
|
||||||
|
|
||||||
esprima@4.0.1: {}
|
esprima@4.0.1: {}
|
||||||
|
|
||||||
@@ -3258,6 +3321,8 @@ snapshots:
|
|||||||
once: 1.4.0
|
once: 1.4.0
|
||||||
path-is-absolute: 1.0.1
|
path-is-absolute: 1.0.1
|
||||||
|
|
||||||
|
globals@14.0.0: {}
|
||||||
|
|
||||||
graceful-fs@4.2.11: {}
|
graceful-fs@4.2.11: {}
|
||||||
|
|
||||||
handlebars@4.7.8:
|
handlebars@4.7.8:
|
||||||
@@ -3279,6 +3344,11 @@ snapshots:
|
|||||||
|
|
||||||
ignore@5.3.2: {}
|
ignore@5.3.2: {}
|
||||||
|
|
||||||
|
import-fresh@3.3.1:
|
||||||
|
dependencies:
|
||||||
|
parent-module: 1.0.1
|
||||||
|
resolve-from: 4.0.0
|
||||||
|
|
||||||
import-local@3.2.0:
|
import-local@3.2.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
pkg-dir: 4.2.0
|
pkg-dir: 4.2.0
|
||||||
@@ -3319,7 +3389,7 @@ snapshots:
|
|||||||
'@babel/parser': 7.28.6
|
'@babel/parser': 7.28.6
|
||||||
'@istanbuljs/schema': 0.1.3
|
'@istanbuljs/schema': 0.1.3
|
||||||
istanbul-lib-coverage: 3.2.2
|
istanbul-lib-coverage: 3.2.2
|
||||||
semver: 7.7.3
|
semver: 7.7.4
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@@ -3666,7 +3736,11 @@ snapshots:
|
|||||||
argparse: 1.0.10
|
argparse: 1.0.10
|
||||||
esprima: 4.0.1
|
esprima: 4.0.1
|
||||||
|
|
||||||
jsdoc-type-pratt-parser@7.1.0: {}
|
js-yaml@4.1.1:
|
||||||
|
dependencies:
|
||||||
|
argparse: 2.0.1
|
||||||
|
|
||||||
|
jsdoc-type-pratt-parser@7.1.1: {}
|
||||||
|
|
||||||
jsesc@3.1.0: {}
|
jsesc@3.1.0: {}
|
||||||
|
|
||||||
@@ -3703,6 +3777,8 @@ snapshots:
|
|||||||
|
|
||||||
lodash.memoize@4.1.2: {}
|
lodash.memoize@4.1.2: {}
|
||||||
|
|
||||||
|
lodash.merge@4.6.2: {}
|
||||||
|
|
||||||
lru-cache@10.4.3: {}
|
lru-cache@10.4.3: {}
|
||||||
|
|
||||||
lru-cache@5.1.1:
|
lru-cache@5.1.1:
|
||||||
@@ -3711,7 +3787,7 @@ snapshots:
|
|||||||
|
|
||||||
make-dir@4.0.0:
|
make-dir@4.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
semver: 7.7.3
|
semver: 7.7.4
|
||||||
|
|
||||||
make-error@1.3.6: {}
|
make-error@1.3.6: {}
|
||||||
|
|
||||||
@@ -3728,10 +3804,6 @@ snapshots:
|
|||||||
|
|
||||||
mimic-fn@2.1.0: {}
|
mimic-fn@2.1.0: {}
|
||||||
|
|
||||||
minimatch@10.1.2:
|
|
||||||
dependencies:
|
|
||||||
'@isaacs/brace-expansion': 5.0.1
|
|
||||||
|
|
||||||
minimatch@3.1.2:
|
minimatch@3.1.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion: 1.1.12
|
brace-expansion: 1.1.12
|
||||||
@@ -3801,6 +3873,10 @@ snapshots:
|
|||||||
|
|
||||||
package-json-from-dist@1.0.1: {}
|
package-json-from-dist@1.0.1: {}
|
||||||
|
|
||||||
|
parent-module@1.0.1:
|
||||||
|
dependencies:
|
||||||
|
callsites: 3.1.0
|
||||||
|
|
||||||
parse-imports-exports@0.2.4:
|
parse-imports-exports@0.2.4:
|
||||||
dependencies:
|
dependencies:
|
||||||
parse-statements: 1.0.11
|
parse-statements: 1.0.11
|
||||||
@@ -3859,12 +3935,16 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
resolve-from: 5.0.0
|
resolve-from: 5.0.0
|
||||||
|
|
||||||
|
resolve-from@4.0.0: {}
|
||||||
|
|
||||||
resolve-from@5.0.0: {}
|
resolve-from@5.0.0: {}
|
||||||
|
|
||||||
semver@6.3.1: {}
|
semver@6.3.1: {}
|
||||||
|
|
||||||
semver@7.7.3: {}
|
semver@7.7.3: {}
|
||||||
|
|
||||||
|
semver@7.7.4: {}
|
||||||
|
|
||||||
shebang-command@2.0.0:
|
shebang-command@2.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
shebang-regex: 3.0.0
|
shebang-regex: 3.0.0
|
||||||
@@ -3889,9 +3969,9 @@ snapshots:
|
|||||||
spdx-expression-parse@4.0.0:
|
spdx-expression-parse@4.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
spdx-exceptions: 2.5.0
|
spdx-exceptions: 2.5.0
|
||||||
spdx-license-ids: 3.0.22
|
spdx-license-ids: 3.0.23
|
||||||
|
|
||||||
spdx-license-ids@3.0.22: {}
|
spdx-license-ids@3.0.23: {}
|
||||||
|
|
||||||
sprintf-js@1.0.3: {}
|
sprintf-js@1.0.3: {}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="toggle-orientation" type="as">
|
<key name="toggle-orientation" type="as">
|
||||||
<default><![CDATA[['<Primary>comma']]]></default>
|
<default><![CDATA[['<Super><Shift>comma']]]></default>
|
||||||
<summary>Toggle active container orientation</summary>
|
<summary>Toggle active container orientation</summary>
|
||||||
<description>Toggles the orientation of the container holding the active window between horizontal and vertical</description>
|
<description>Toggles the orientation of the container holding the active window between horizontal and vertical</description>
|
||||||
</key>
|
</key>
|
||||||
@@ -55,11 +55,5 @@
|
|||||||
<description>Resets all window size ratios in the active window's container to equal splits</description>
|
<description>Resets all window size ratios in the active window's container to equal splits</description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="toggle-tabbed" type="as">
|
|
||||||
<default><![CDATA[['<Primary>slash']]]></default>
|
|
||||||
<summary>Toggle tabbed container mode</summary>
|
|
||||||
<description>Toggles the active window's container between tabbed and accordion layout modes</description>
|
|
||||||
</key>
|
|
||||||
|
|
||||||
</schema>
|
</schema>
|
||||||
</schemalist>
|
</schemalist>
|
||||||
@@ -20,38 +20,25 @@ jest.mock('../utils/events.js', () => ({
|
|||||||
|
|
||||||
describe('Container Logic Tests', () => {
|
describe('Container Logic Tests', () => {
|
||||||
describe('Orientation Toggle Logic', () => {
|
describe('Orientation Toggle Logic', () => {
|
||||||
enum Layout {
|
enum Orientation {
|
||||||
HORIZONTAL = 0,
|
HORIZONTAL = 0,
|
||||||
VERTICAL = 1,
|
VERTICAL = 1,
|
||||||
TABBED = 2,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const toggleOrientation = (current: Layout): Layout => {
|
const toggleOrientation = (current: Orientation): Orientation => {
|
||||||
if (current === Layout.TABBED) return Layout.HORIZONTAL;
|
return current === Orientation.HORIZONTAL
|
||||||
return current === Layout.HORIZONTAL
|
? Orientation.VERTICAL
|
||||||
? Layout.VERTICAL
|
: Orientation.HORIZONTAL;
|
||||||
: Layout.HORIZONTAL;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
test('should toggle from HORIZONTAL to VERTICAL', () => {
|
test('should toggle from HORIZONTAL to VERTICAL', () => {
|
||||||
const result = toggleOrientation(Layout.HORIZONTAL);
|
const result = toggleOrientation(Orientation.HORIZONTAL);
|
||||||
expect(result).toBe(Layout.VERTICAL);
|
expect(result).toBe(Orientation.VERTICAL);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should toggle from VERTICAL to HORIZONTAL', () => {
|
test('should toggle from VERTICAL to HORIZONTAL', () => {
|
||||||
const result = toggleOrientation(Layout.VERTICAL);
|
const result = toggleOrientation(Orientation.VERTICAL);
|
||||||
expect(result).toBe(Layout.HORIZONTAL);
|
expect(result).toBe(Orientation.HORIZONTAL);
|
||||||
});
|
|
||||||
|
|
||||||
test('should toggle from TABBED to HORIZONTAL', () => {
|
|
||||||
const result = toggleOrientation(Layout.TABBED);
|
|
||||||
expect(result).toBe(Layout.HORIZONTAL);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('enum reverse mapping should return string names', () => {
|
|
||||||
expect(Layout[Layout.HORIZONTAL]).toBe('HORIZONTAL');
|
|
||||||
expect(Layout[Layout.VERTICAL]).toBe('VERTICAL');
|
|
||||||
expect(Layout[Layout.TABBED]).toBe('TABBED');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -113,71 +100,6 @@ describe('Container Logic Tests', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Tabbed Bounds Calculation', () => {
|
|
||||||
const TAB_BAR_HEIGHT = 24;
|
|
||||||
|
|
||||||
test('should give all items the same content rect in tabbed mode', () => {
|
|
||||||
const workArea = { x: 100, y: 0, width: 1000, height: 500 };
|
|
||||||
const itemCount = 3;
|
|
||||||
|
|
||||||
const contentRect = {
|
|
||||||
x: workArea.x,
|
|
||||||
y: workArea.y + TAB_BAR_HEIGHT,
|
|
||||||
width: workArea.width,
|
|
||||||
height: workArea.height - TAB_BAR_HEIGHT,
|
|
||||||
};
|
|
||||||
|
|
||||||
const bounds = Array.from({ length: itemCount }, () => contentRect);
|
|
||||||
|
|
||||||
expect(bounds.length).toBe(3);
|
|
||||||
// All bounds should be identical
|
|
||||||
bounds.forEach(b => {
|
|
||||||
expect(b.x).toBe(100);
|
|
||||||
expect(b.y).toBe(TAB_BAR_HEIGHT);
|
|
||||||
expect(b.width).toBe(1000);
|
|
||||||
expect(b.height).toBe(500 - TAB_BAR_HEIGHT);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('tab bar rect should occupy top of work area', () => {
|
|
||||||
const workArea = { x: 200, y: 50, width: 800, height: 600 };
|
|
||||||
|
|
||||||
const tabBarRect = {
|
|
||||||
x: workArea.x,
|
|
||||||
y: workArea.y,
|
|
||||||
width: workArea.width,
|
|
||||||
height: TAB_BAR_HEIGHT,
|
|
||||||
};
|
|
||||||
|
|
||||||
expect(tabBarRect.x).toBe(200);
|
|
||||||
expect(tabBarRect.y).toBe(50);
|
|
||||||
expect(tabBarRect.width).toBe(800);
|
|
||||||
expect(tabBarRect.height).toBe(TAB_BAR_HEIGHT);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('active tab index should clamp after removal', () => {
|
|
||||||
let activeTabIndex = 2;
|
|
||||||
const itemCount = 2; // after removing one from 3
|
|
||||||
|
|
||||||
if (activeTabIndex >= itemCount) {
|
|
||||||
activeTabIndex = itemCount - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
expect(activeTabIndex).toBe(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('active tab index should stay at 0 when first item removed', () => {
|
|
||||||
let activeTabIndex = 0;
|
|
||||||
const itemCount = 2; // after removing one from 3
|
|
||||||
|
|
||||||
if (activeTabIndex >= itemCount) {
|
|
||||||
activeTabIndex = itemCount - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
expect(activeTabIndex).toBe(0);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Window Index Finding', () => {
|
describe('Window Index Finding', () => {
|
||||||
test('should find window index in array', () => {
|
test('should find window index in array', () => {
|
||||||
const windows = [
|
const windows = [
|
||||||
|
|||||||
@@ -182,15 +182,6 @@ export default class AerospikeExtensions extends ExtensionPreferences {
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
keybindingsGroup.add(
|
|
||||||
new EntryRow({
|
|
||||||
title: _('Toggle Tabbed Mode'),
|
|
||||||
settings: settings,
|
|
||||||
bind: 'toggle-tabbed',
|
|
||||||
map: keybindingMap
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function to create a keybinding mapping object
|
// Helper function to create a keybinding mapping object
|
||||||
|
|||||||
@@ -2,12 +2,10 @@ import {WindowWrapper} from "./window.js";
|
|||||||
import {Logger} from "../utils/logger.js";
|
import {Logger} from "../utils/logger.js";
|
||||||
import queueEvent from "../utils/events.js";
|
import queueEvent from "../utils/events.js";
|
||||||
import {Rect} from "../utils/rect.js";
|
import {Rect} from "../utils/rect.js";
|
||||||
import {TabBar, TAB_BAR_HEIGHT} from "./tabBar.js";
|
|
||||||
|
|
||||||
export enum Layout {
|
enum Orientation {
|
||||||
ACC_HORIZONTAL = 0,
|
HORIZONTAL = 0,
|
||||||
ACC_VERTICAL = 1,
|
VERTICAL = 1,
|
||||||
TABBED = 2,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns equal ratios summing exactly to 1.0, with float drift absorbed by the last slot.
|
// Returns equal ratios summing exactly to 1.0, with float drift absorbed by the last slot.
|
||||||
@@ -24,17 +22,10 @@ export default class WindowContainer {
|
|||||||
|
|
||||||
_tiledItems: (WindowWrapper | WindowContainer)[];
|
_tiledItems: (WindowWrapper | WindowContainer)[];
|
||||||
_tiledWindowLookup: Map<number, WindowWrapper>;
|
_tiledWindowLookup: Map<number, WindowWrapper>;
|
||||||
_orientation: Layout = Layout.ACC_HORIZONTAL;
|
_orientation: Orientation = Orientation.HORIZONTAL;
|
||||||
_workArea: Rect;
|
_workArea: Rect;
|
||||||
|
|
||||||
// -- Accordion Mode States
|
|
||||||
|
|
||||||
_splitRatios: number[];
|
_splitRatios: number[];
|
||||||
|
|
||||||
// -- Tabbed mode state -----------------------------------------------------
|
|
||||||
_activeTabIndex: number = 0;
|
|
||||||
_tabBar: TabBar | null = null;
|
|
||||||
|
|
||||||
constructor(workspaceArea: Rect) {
|
constructor(workspaceArea: Rect) {
|
||||||
this._tiledItems = [];
|
this._tiledItems = [];
|
||||||
this._tiledWindowLookup = new Map<number, WindowWrapper>();
|
this._tiledWindowLookup = new Map<number, WindowWrapper>();
|
||||||
@@ -42,7 +33,7 @@ export default class WindowContainer {
|
|||||||
this._splitRatios = [];
|
this._splitRatios = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Helpers ----------------------------------------------------------------
|
// ─── Helpers ────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
private _resetRatios(): void {
|
private _resetRatios(): void {
|
||||||
this._splitRatios = equalRatios(this._tiledItems.length);
|
this._splitRatios = equalRatios(this._tiledItems.length);
|
||||||
@@ -63,128 +54,33 @@ export default class WindowContainer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private _totalDimension(): number {
|
private _totalDimension(): number {
|
||||||
return this._orientation === Layout.ACC_HORIZONTAL
|
return this._orientation === Orientation.HORIZONTAL
|
||||||
? this._workArea.width
|
? this._workArea.width
|
||||||
: this._workArea.height;
|
: this._workArea.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
isTabbed(): boolean {
|
// ─── Public API ─────────────────────────────────────────────────────────────
|
||||||
return this._orientation === Layout.TABBED;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- Public API -------------------------------------------------------------
|
|
||||||
|
|
||||||
move(rect: Rect): void {
|
move(rect: Rect): void {
|
||||||
this._workArea = rect;
|
this._workArea = rect;
|
||||||
this.drawWindows();
|
this.tileWindows();
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleOrientation(): void {
|
toggleOrientation(): void {
|
||||||
if (this._orientation === Layout.TABBED) {
|
this._orientation = this._orientation === Orientation.HORIZONTAL
|
||||||
// Tabbed → Horizontal: restore accordion mode
|
? Orientation.VERTICAL
|
||||||
this.setAccordion(Layout.ACC_HORIZONTAL);
|
: Orientation.HORIZONTAL;
|
||||||
} else {
|
Logger.info(`Container orientation toggled to ${this._orientation === Orientation.HORIZONTAL ? 'HORIZONTAL' : 'VERTICAL'}`);
|
||||||
this._orientation = this._orientation === Layout.ACC_HORIZONTAL
|
this.tileWindows();
|
||||||
? Layout.ACC_VERTICAL
|
|
||||||
: Layout.ACC_HORIZONTAL;
|
|
||||||
Logger.info(`Container orientation toggled to ${Layout[this._orientation]}`);
|
|
||||||
this.drawWindows();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Switch this container to tabbed mode.
|
|
||||||
*/
|
|
||||||
setTabbed(): void {
|
|
||||||
if (this._orientation === Layout.TABBED) return;
|
|
||||||
|
|
||||||
Logger.info("Container switching to TABBED mode");
|
|
||||||
this._orientation = Layout.TABBED;
|
|
||||||
|
|
||||||
// Clamp active tab index
|
|
||||||
if (this._activeTabIndex < 0 || this._activeTabIndex >= this._tiledItems.length) {
|
|
||||||
this._activeTabIndex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create tab bar
|
|
||||||
this._tabBar = new TabBar((index) => {
|
|
||||||
this.setActiveTab(index);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.drawWindows();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Switch this container back to accordion (H or V) mode.
|
|
||||||
*/
|
|
||||||
setAccordion(orientation: Layout.ACC_HORIZONTAL | Layout.ACC_VERTICAL): void {
|
|
||||||
if (this._orientation !== Layout.TABBED) {
|
|
||||||
// Already accordion — just set the orientation
|
|
||||||
this._orientation = orientation;
|
|
||||||
this.drawWindows();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger.info(`Container switching from TABBED to ${Layout[orientation]}`);
|
|
||||||
this._orientation = orientation;
|
|
||||||
|
|
||||||
// Destroy tab bar
|
|
||||||
if (this._tabBar) {
|
|
||||||
this._tabBar.destroy();
|
|
||||||
this._tabBar = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show all windows (they may have been hidden in tabbed mode)
|
|
||||||
this._showAllWindows();
|
|
||||||
|
|
||||||
this.drawWindows();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the active tab by index. Shows that window, hides others, updates tab bar.
|
|
||||||
*/
|
|
||||||
setActiveTab(index: number): void {
|
|
||||||
if (!this.isTabbed()) return;
|
|
||||||
if (index < 0 || index >= this._tiledItems.length) return;
|
|
||||||
|
|
||||||
this._activeTabIndex = index;
|
|
||||||
Logger.info(`Active tab set to ${index}`);
|
|
||||||
|
|
||||||
this._applyTabVisibility();
|
|
||||||
this._updateTabBar();
|
|
||||||
|
|
||||||
// Tile to resize the active window to the content area
|
|
||||||
this.drawWindows();
|
|
||||||
}
|
|
||||||
|
|
||||||
getActiveTabIndex(): number {
|
|
||||||
return this._activeTabIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
hideTabBar(): void {
|
|
||||||
this._tabBar?.hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
showTabBar(): void {
|
|
||||||
if (this.isTabbed() && this._tabBar) {
|
|
||||||
this._tabBar.show();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addWindow(winWrap: WindowWrapper): void {
|
addWindow(winWrap: WindowWrapper): void {
|
||||||
this._tiledItems.push(winWrap);
|
this._tiledItems.push(winWrap);
|
||||||
this._tiledWindowLookup.set(winWrap.getWindowId(), winWrap);
|
this._tiledWindowLookup.set(winWrap.getWindowId(), winWrap);
|
||||||
this._addRatioForNewWindow();
|
this._addRatioForNewWindow();
|
||||||
|
|
||||||
if (this.isTabbed()) {
|
|
||||||
// TODO: make it so that when tabs are added they are made the current active tab
|
|
||||||
this._applyTabVisibility();
|
|
||||||
this._updateTabBar();
|
|
||||||
}
|
|
||||||
|
|
||||||
queueEvent({
|
queueEvent({
|
||||||
name: "tiling-windows",
|
name: "tiling-windows",
|
||||||
callback: () => this.drawWindows(),
|
callback: () => this.tileWindows(),
|
||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,28 +111,13 @@ export default class WindowContainer {
|
|||||||
|
|
||||||
removeWindow(win_id: number): void {
|
removeWindow(win_id: number): void {
|
||||||
if (this._tiledWindowLookup.has(win_id)) {
|
if (this._tiledWindowLookup.has(win_id)) {
|
||||||
|
// Get index before deleting from lookup to avoid race condition
|
||||||
const index = this._getIndexOfWindow(win_id);
|
const index = this._getIndexOfWindow(win_id);
|
||||||
this._tiledWindowLookup.delete(win_id);
|
this._tiledWindowLookup.delete(win_id);
|
||||||
if (index !== -1) {
|
if (index !== -1) {
|
||||||
// If removing the window that was hidden in tabbed mode,
|
|
||||||
// make sure to show it first so it doesn't stay invisible
|
|
||||||
const item = this._tiledItems[index];
|
|
||||||
if (item instanceof WindowWrapper) {
|
|
||||||
item.showWindow();
|
|
||||||
}
|
|
||||||
this._tiledItems.splice(index, 1);
|
this._tiledItems.splice(index, 1);
|
||||||
}
|
}
|
||||||
this._resetRatios();
|
this._resetRatios();
|
||||||
|
|
||||||
if (this.isTabbed()) {
|
|
||||||
if (this._tiledItems.length === 0) {
|
|
||||||
this._activeTabIndex = 0;
|
|
||||||
} else if (this._activeTabIndex >= this._tiledItems.length) {
|
|
||||||
this._activeTabIndex = this._tiledItems.length - 1;
|
|
||||||
}
|
|
||||||
this._applyTabVisibility();
|
|
||||||
this._updateTabBar();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
for (const item of this._tiledItems) {
|
for (const item of this._tiledItems) {
|
||||||
if (item instanceof WindowContainer) {
|
if (item instanceof WindowContainer) {
|
||||||
@@ -244,7 +125,7 @@ export default class WindowContainer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.drawWindows();
|
this.tileWindows();
|
||||||
}
|
}
|
||||||
|
|
||||||
disconnectSignals(): void {
|
disconnectSignals(): void {
|
||||||
@@ -258,152 +139,37 @@ export default class WindowContainer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
removeAllWindows(): void {
|
removeAllWindows(): void {
|
||||||
// tabbed mode hides all windows - this ensures they are available before removal
|
|
||||||
this._showAllWindows();
|
|
||||||
|
|
||||||
if (this._tabBar) {
|
|
||||||
this._tabBar.destroy();
|
|
||||||
this._tabBar = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._tiledItems = [];
|
this._tiledItems = [];
|
||||||
this._tiledWindowLookup.clear();
|
this._tiledWindowLookup.clear();
|
||||||
this._splitRatios = [];
|
this._splitRatios = [];
|
||||||
this._activeTabIndex = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
drawWindows(): void {
|
tileWindows(): void {
|
||||||
Logger.log("TILING WINDOWS IN CONTAINER");
|
Logger.log("TILING WINDOWS IN CONTAINER");
|
||||||
Logger.log("WorkArea", this._workArea);
|
Logger.log("WorkArea", this._workArea);
|
||||||
|
this._tileItems();
|
||||||
if (this.isTabbed()) {
|
|
||||||
this._tileTab();
|
|
||||||
} else {
|
|
||||||
this._tileAccordion();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_tileAccordion() {
|
_tileItems() {
|
||||||
if (this._tiledItems.length === 0) return;
|
if (this._tiledItems.length === 0) return;
|
||||||
|
|
||||||
const bounds = this.getBounds();
|
const bounds = this.getBounds();
|
||||||
Logger.info(`_tileAccordion: ratios=[${this._splitRatios.map(r => r.toFixed(3)).join(', ')}] bounds=[${bounds.map(b => `(${b.x},${b.y},${b.width},${b.height})`).join(', ')}]`);
|
Logger.info(`_tileItems: ratios=[${this._splitRatios.map(r => r.toFixed(3)).join(', ')}] bounds=[${bounds.map(b => `(${b.x},${b.y},${b.width},${b.height})`).join(', ')}]`);
|
||||||
this._tiledItems.forEach((item, index) => {
|
this._tiledItems.forEach((item, index) => {
|
||||||
const rect = bounds[index];
|
const rect = bounds[index];
|
||||||
if (item instanceof WindowContainer) {
|
if (item instanceof WindowContainer) {
|
||||||
item.move(rect);
|
item.move(rect);
|
||||||
} else {
|
} else {
|
||||||
Logger.info(`_tileAccordion: window[${index}] id=${item.getWindowId()} dragging=${item._dragging} → rect=(${rect.x},${rect.y},${rect.width},${rect.height})`);
|
Logger.info(`_tileItems: window[${index}] id=${item.getWindowId()} dragging=${item._dragging} → rect=(${rect.x},${rect.y},${rect.width},${rect.height})`);
|
||||||
item.safelyResizeWindow(rect);
|
item.safelyResizeWindow(rect);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private _tileTab(): void {
|
// ─── Bounds Calculation ──────────────────────────────────────────────────────
|
||||||
if (this._tiledItems.length === 0) return;
|
|
||||||
|
|
||||||
const tabBarRect: Rect = {
|
|
||||||
x: this._workArea.x,
|
|
||||||
y: this._workArea.y,
|
|
||||||
width: this._workArea.width,
|
|
||||||
height: TAB_BAR_HEIGHT,
|
|
||||||
};
|
|
||||||
|
|
||||||
const contentRect: Rect = {
|
|
||||||
x: this._workArea.x,
|
|
||||||
y: this._workArea.y + TAB_BAR_HEIGHT,
|
|
||||||
width: this._workArea.width,
|
|
||||||
height: this._workArea.height - TAB_BAR_HEIGHT,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Position and show the tab bar
|
|
||||||
if (this._tabBar) {
|
|
||||||
this._tabBar.setPosition(tabBarRect);
|
|
||||||
if (!this._tabBar.isVisible()) {
|
|
||||||
this._rebuildAndShowTabBar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this._applyTabVisibility();
|
|
||||||
|
|
||||||
const activeItem = this._tiledItems[this._activeTabIndex];
|
|
||||||
if (activeItem) {
|
|
||||||
if (activeItem instanceof WindowContainer) {
|
|
||||||
activeItem.move(contentRect);
|
|
||||||
} else {
|
|
||||||
Logger.info(`_tileTabbed: active tab[${this._activeTabIndex}] id=${activeItem.getWindowId()} → rect=(${contentRect.x},${contentRect.y},${contentRect.width},${contentRect.height})`);
|
|
||||||
activeItem.safelyResizeWindow(contentRect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show the active tab window, hide all others.
|
|
||||||
*/
|
|
||||||
private _applyTabVisibility(): void {
|
|
||||||
this._tiledItems.forEach((item, index) => {
|
|
||||||
if (item instanceof WindowWrapper) {
|
|
||||||
if (index === this._activeTabIndex) {
|
|
||||||
item.showWindow();
|
|
||||||
} else {
|
|
||||||
item.hideWindow();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show all windows (used when leaving tabbed mode).
|
|
||||||
*/
|
|
||||||
private _showAllWindows(): void {
|
|
||||||
this._tiledItems.forEach((item) => {
|
|
||||||
if (item instanceof WindowWrapper) {
|
|
||||||
item.showWindow();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rebuild the tab bar buttons and show it.
|
|
||||||
*/
|
|
||||||
private _rebuildAndShowTabBar(): void {
|
|
||||||
if (!this._tabBar) return;
|
|
||||||
|
|
||||||
const windowItems = this._tiledItems.filter(
|
|
||||||
(item): item is WindowWrapper => item instanceof WindowWrapper
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabBar.rebuild(windowItems, this._activeTabIndex);
|
|
||||||
this._tabBar.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update tab bar state (active highlight, titles) without a full rebuild.
|
|
||||||
*/
|
|
||||||
private _updateTabBar(): void {
|
|
||||||
if (!this._tabBar) return;
|
|
||||||
|
|
||||||
// Rebuild is cheap — just recreate buttons from the current items
|
|
||||||
const windowItems = this._tiledItems.filter(
|
|
||||||
(item): item is WindowWrapper => item instanceof WindowWrapper
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabBar.rebuild(windowItems, this._activeTabIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
getBounds(): Rect[] {
|
getBounds(): Rect[] {
|
||||||
if (this._orientation === Layout.TABBED) {
|
return this._orientation === Orientation.HORIZONTAL
|
||||||
// In tabbed mode, all items share the same content rect
|
|
||||||
const contentRect: Rect = {
|
|
||||||
x: this._workArea.x,
|
|
||||||
y: this._workArea.y + TAB_BAR_HEIGHT,
|
|
||||||
width: this._workArea.width,
|
|
||||||
height: this._workArea.height - TAB_BAR_HEIGHT,
|
|
||||||
};
|
|
||||||
return this._tiledItems.map(() => contentRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this._orientation === Layout.ACC_HORIZONTAL
|
|
||||||
? this._computeBounds('horizontal')
|
? this._computeBounds('horizontal')
|
||||||
: this._computeBounds('vertical');
|
: this._computeBounds('vertical');
|
||||||
}
|
}
|
||||||
@@ -426,10 +192,9 @@ export default class WindowContainer {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
adjustBoundary(boundaryIndex: number, deltaPixels: number): boolean {
|
// ─── Boundary Adjustment ─────────────────────────────────────────────────────
|
||||||
// No boundary adjustment in tabbed mode
|
|
||||||
if (this.isTabbed()) return false;
|
|
||||||
|
|
||||||
|
adjustBoundary(boundaryIndex: number, deltaPixels: number): boolean {
|
||||||
if (boundaryIndex < 0 || boundaryIndex >= this._tiledItems.length - 1) {
|
if (boundaryIndex < 0 || boundaryIndex >= this._tiledItems.length - 1) {
|
||||||
Logger.warn(`adjustBoundary: invalid boundaryIndex ${boundaryIndex}`);
|
Logger.warn(`adjustBoundary: invalid boundaryIndex ${boundaryIndex}`);
|
||||||
return false;
|
return false;
|
||||||
@@ -454,7 +219,7 @@ export default class WindowContainer {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Container Lookup --------------------------------------------------------
|
// ─── Container Lookup ────────────────────────────────────────────────────────
|
||||||
|
|
||||||
getContainerForWindow(win_id: number): WindowContainer | null {
|
getContainerForWindow(win_id: number): WindowContainer | null {
|
||||||
for (const item of this._tiledItems) {
|
for (const item of this._tiledItems) {
|
||||||
@@ -483,12 +248,6 @@ export default class WindowContainer {
|
|||||||
|
|
||||||
// TODO: update this to work with nested containers - all other logic should already be working
|
// TODO: update this to work with nested containers - all other logic should already be working
|
||||||
itemDragged(item: WindowWrapper, x: number, y: number): void {
|
itemDragged(item: WindowWrapper, x: number, y: number): void {
|
||||||
// In tabbed mode, dragging reorders tabs but doesn't change layout
|
|
||||||
if (this.isTabbed()) {
|
|
||||||
// Don't reorder during tabbed mode — tabs have a fixed visual layout
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const original_index = this.getIndexOfItemNested(item);
|
const original_index = this.getIndexOfItemNested(item);
|
||||||
|
|
||||||
if (original_index === -1) {
|
if (original_index === -1) {
|
||||||
@@ -507,12 +266,12 @@ export default class WindowContainer {
|
|||||||
Logger.info(`itemDragged: swapped slots ${original_index}<->${new_index}, ratios=[${this._splitRatios.map(r => r.toFixed(3)).join(', ')}]`);
|
Logger.info(`itemDragged: swapped slots ${original_index}<->${new_index}, ratios=[${this._splitRatios.map(r => r.toFixed(3)).join(', ')}]`);
|
||||||
[this._tiledItems[original_index], this._tiledItems[new_index]] =
|
[this._tiledItems[original_index], this._tiledItems[new_index]] =
|
||||||
[this._tiledItems[new_index], this._tiledItems[original_index]];
|
[this._tiledItems[new_index], this._tiledItems[original_index]];
|
||||||
this.drawWindows();
|
this.tileWindows();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resetRatios(): void {
|
resetRatios(): void {
|
||||||
this._resetRatios();
|
this._resetRatios();
|
||||||
this.drawWindows();
|
this.tileWindows();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import {WindowWrapper} from "./window.js";
|
import {WindowWrapper} from "./window.js";
|
||||||
import {Rect} from "../utils/rect.js";
|
import {Rect} from "../utils/rect.js";
|
||||||
import {Logger} from "../utils/logger.js";
|
import {Logger} from "../utils/logger.js";
|
||||||
|
import Meta from "gi://Meta";
|
||||||
|
|
||||||
import WindowContainer from "./container.js";
|
import WindowContainer from "./container.js";
|
||||||
|
|
||||||
@@ -72,18 +73,6 @@ export default class Monitor {
|
|||||||
this._workspaces.push(new WindowContainer(this._workArea));
|
this._workspaces.push(new WindowContainer(this._workArea));
|
||||||
}
|
}
|
||||||
|
|
||||||
hideTabBars(): void {
|
|
||||||
for (const container of this._workspaces) {
|
|
||||||
container.hideTabBar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
showTabBars(): void {
|
|
||||||
for (const container of this._workspaces) {
|
|
||||||
container.showTabBar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
itemDragged(item: WindowWrapper, x: number, y: number): void {
|
itemDragged(item: WindowWrapper, x: number, y: number): void {
|
||||||
this._workspaces[item.getWorkspace()].itemDragged(item, x, y);
|
this._workspaces[item.getWorkspace()].itemDragged(item, x, y);
|
||||||
}
|
}
|
||||||
|
|||||||
125
src/wm/tabBar.ts
125
src/wm/tabBar.ts
@@ -1,125 +0,0 @@
|
|||||||
import Clutter from 'gi://Clutter';
|
|
||||||
import St from 'gi://St';
|
|
||||||
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
|
||||||
import {Logger} from "../utils/logger.js";
|
|
||||||
import {WindowWrapper} from "./window.js";
|
|
||||||
import {Rect} from "../utils/rect.js";
|
|
||||||
|
|
||||||
export const TAB_BAR_HEIGHT = 24;
|
|
||||||
|
|
||||||
type TabClickedCallback = (index: number) => void;
|
|
||||||
|
|
||||||
export class TabBar {
|
|
||||||
private _bar: St.BoxLayout;
|
|
||||||
private _buttons: St.Button[] = [];
|
|
||||||
private _activeIndex: number = 0;
|
|
||||||
private _onTabClicked: TabClickedCallback;
|
|
||||||
private _visible: boolean = false;
|
|
||||||
|
|
||||||
constructor(onTabClicked: TabClickedCallback) {
|
|
||||||
this._onTabClicked = onTabClicked;
|
|
||||||
this._bar = new St.BoxLayout({
|
|
||||||
style_class: 'aerospike-tab-bar',
|
|
||||||
vertical: false,
|
|
||||||
reactive: true,
|
|
||||||
can_focus: false,
|
|
||||||
track_hover: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rebuild all tab buttons from the current list of window items.
|
|
||||||
*/
|
|
||||||
rebuild(items: WindowWrapper[], activeIndex: number): void {
|
|
||||||
// Remove old buttons
|
|
||||||
this._bar.destroy_all_children();
|
|
||||||
this._buttons = [];
|
|
||||||
|
|
||||||
items.forEach((item, index) => {
|
|
||||||
const button = new St.Button({
|
|
||||||
style_class: 'aerospike-tab',
|
|
||||||
reactive: true,
|
|
||||||
can_focus: false,
|
|
||||||
track_hover: true,
|
|
||||||
x_expand: true,
|
|
||||||
child: new St.Label({
|
|
||||||
text: item.getTabLabel(),
|
|
||||||
style_class: 'aerospike-tab-label',
|
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
|
||||||
x_align: Clutter.ActorAlign.CENTER,
|
|
||||||
x_expand: true,
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
button.connect('clicked', () => {
|
|
||||||
this._onTabClicked(index);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._bar.add_child(button);
|
|
||||||
this._buttons.push(button);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.setActive(activeIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update just the title text of a single tab (e.g. when a window title changes).
|
|
||||||
*/
|
|
||||||
updateTabTitle(index: number, title: string): void {
|
|
||||||
if (index < 0 || index >= this._buttons.length) return;
|
|
||||||
const label = this._buttons[index].get_child() as St.Label;
|
|
||||||
if (label) label.set_text(title);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Highlight the active tab and dim the rest.
|
|
||||||
*/
|
|
||||||
setActive(index: number): void {
|
|
||||||
this._activeIndex = index;
|
|
||||||
this._buttons.forEach((btn, i) => {
|
|
||||||
if (i === index) {
|
|
||||||
btn.add_style_class_name('aerospike-tab-active');
|
|
||||||
} else {
|
|
||||||
btn.remove_style_class_name('aerospike-tab-active');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Position and size the tab bar at the given screen rect.
|
|
||||||
*/
|
|
||||||
setPosition(rect: Rect): void {
|
|
||||||
this._bar.set_position(rect.x, rect.y);
|
|
||||||
this._bar.set_size(rect.width, rect.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
show(): void {
|
|
||||||
if (this._visible) return;
|
|
||||||
this._visible = true;
|
|
||||||
Main.layoutManager.uiGroup.add_child(this._bar);
|
|
||||||
this._bar.show();
|
|
||||||
Logger.log("TabBar shown");
|
|
||||||
}
|
|
||||||
|
|
||||||
hide(): void {
|
|
||||||
if (!this._visible) return;
|
|
||||||
this._visible = false;
|
|
||||||
this._bar.hide();
|
|
||||||
if (this._bar.get_parent()) {
|
|
||||||
Main.layoutManager.uiGroup.remove_child(this._bar);
|
|
||||||
}
|
|
||||||
Logger.log("TabBar hidden");
|
|
||||||
}
|
|
||||||
|
|
||||||
destroy(): void {
|
|
||||||
this.hide();
|
|
||||||
this._bar.destroy_all_children();
|
|
||||||
this._buttons = [];
|
|
||||||
this._bar.destroy();
|
|
||||||
Logger.log("TabBar destroyed");
|
|
||||||
}
|
|
||||||
|
|
||||||
isVisible(): boolean {
|
|
||||||
return this._visible;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -47,25 +47,6 @@ export class WindowWrapper {
|
|||||||
return this._window.get_frame_rect();
|
return this._window.get_frame_rect();
|
||||||
}
|
}
|
||||||
|
|
||||||
getTabLabel(): string {
|
|
||||||
const appName = this._window.get_wm_class() ?? '';
|
|
||||||
const title = this._window.get_title() ?? 'Untitled';
|
|
||||||
if (appName && appName.toLowerCase() !== title.toLowerCase()) {
|
|
||||||
return `${appName} | ${title}`;
|
|
||||||
}
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
|
|
||||||
hideWindow(): void {
|
|
||||||
const actor = this._window.get_compositor_private() as Clutter.Actor | null;
|
|
||||||
if (actor) actor.hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
showWindow(): void {
|
|
||||||
const actor = this._window.get_compositor_private() as Clutter.Actor | null;
|
|
||||||
if (actor) actor.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
startDragging(): void {
|
startDragging(): void {
|
||||||
this._dragging = true;
|
this._dragging = true;
|
||||||
}
|
}
|
||||||
@@ -138,10 +119,6 @@ export class WindowWrapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
actor.remove_all_transitions();
|
actor.remove_all_transitions();
|
||||||
|
|
||||||
// Move first to guarantee the window reaches the correct position even
|
|
||||||
// if the subsequent resize is clamped by minimum-size hints.
|
|
||||||
this._window.move_frame(true, rect.x, rect.y);
|
|
||||||
this._window.move_resize_frame(true, rect.x, rect.y, rect.width, rect.height);
|
this._window.move_resize_frame(true, rect.x, rect.y, rect.width, rect.height);
|
||||||
|
|
||||||
const new_rect = this._window.get_frame_rect();
|
const new_rect = this._window.get_frame_rect();
|
||||||
@@ -152,19 +129,6 @@ export class WindowWrapper {
|
|||||||
Math.abs(new_rect.height - rect.height) > WindowWrapper.RESIZE_TOLERANCE;
|
Math.abs(new_rect.height - rect.height) > WindowWrapper.RESIZE_TOLERANCE;
|
||||||
|
|
||||||
if (_retry > 0 && mismatch) {
|
if (_retry > 0 && mismatch) {
|
||||||
// If the window's actual size is larger than requested, it has a
|
|
||||||
// minimum-size constraint — retrying won't help. Just make sure
|
|
||||||
// it's at the correct position with its actual size.
|
|
||||||
const sizeConstrained =
|
|
||||||
new_rect.width > rect.width + WindowWrapper.RESIZE_TOLERANCE ||
|
|
||||||
new_rect.height > rect.height + WindowWrapper.RESIZE_TOLERANCE;
|
|
||||||
|
|
||||||
if (sizeConstrained) {
|
|
||||||
Logger.info("Window has min-size constraint, accepting actual size",
|
|
||||||
`want(${rect.x},${rect.y},${rect.width},${rect.height})`,
|
|
||||||
`actual(${new_rect.x},${new_rect.y},${new_rect.width},${new_rect.height})`);
|
|
||||||
this._window.move_frame(true, rect.x, rect.y);
|
|
||||||
} else {
|
|
||||||
Logger.warn("RESIZE MISMATCH, retrying",
|
Logger.warn("RESIZE MISMATCH, retrying",
|
||||||
`want(${rect.x},${rect.y},${rect.width},${rect.height})`,
|
`want(${rect.x},${rect.y},${rect.width},${rect.height})`,
|
||||||
`got(${new_rect.x},${new_rect.y},${new_rect.width},${new_rect.height})`);
|
`got(${new_rect.x},${new_rect.y},${new_rect.width},${new_rect.height})`);
|
||||||
@@ -175,4 +139,3 @@ export class WindowWrapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import {WindowWrapper} from './window.js';
|
|||||||
import * as Main from "resource:///org/gnome/shell/ui/main.js";
|
import * as Main from "resource:///org/gnome/shell/ui/main.js";
|
||||||
import {Logger} from "../utils/logger.js";
|
import {Logger} from "../utils/logger.js";
|
||||||
import Monitor from "./monitor.js";
|
import Monitor from "./monitor.js";
|
||||||
import WindowContainer, {Layout} from "./container.js";
|
import WindowContainer from "./container.js";
|
||||||
import {Rect} from "../utils/rect.js";
|
import {Rect} from "../utils/rect.js";
|
||||||
|
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ export default class WindowManager implements IWindowManager {
|
|||||||
_changingGrabbedMonitor: boolean = false;
|
_changingGrabbedMonitor: boolean = false;
|
||||||
_showingOverview: boolean = false;
|
_showingOverview: boolean = false;
|
||||||
|
|
||||||
// -- Resize-drag tracking --------------------------------------------------
|
// ── Resize-drag tracking ──────────────────────────────────────────────────
|
||||||
_isResizeDrag: boolean = false;
|
_isResizeDrag: boolean = false;
|
||||||
_resizeDragWindowId: number = _UNUSED_WINDOW_ID;
|
_resizeDragWindowId: number = _UNUSED_WINDOW_ID;
|
||||||
_resizeDragOp: Meta.GrabOp = Meta.GrabOp.NONE;
|
_resizeDragOp: Meta.GrabOp = Meta.GrabOp.NONE;
|
||||||
@@ -132,16 +132,10 @@ export default class WindowManager implements IWindowManager {
|
|||||||
Logger.log("HIDING OVERVIEW")
|
Logger.log("HIDING OVERVIEW")
|
||||||
this._showingOverview = false;
|
this._showingOverview = false;
|
||||||
this._tileMonitors();
|
this._tileMonitors();
|
||||||
for (const monitor of this._monitors.values()) {
|
|
||||||
monitor.showTabBars();
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
Main.overview.connect("showing", () => {
|
Main.overview.connect("showing", () => {
|
||||||
this._showingOverview = true;
|
this._showingOverview = true;
|
||||||
Logger.log("SHOWING OVERVIEW");
|
Logger.log("SHOWING OVERVIEW");
|
||||||
for (const monitor of this._monitors.values()) {
|
|
||||||
monitor.hideTabBars();
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -335,7 +329,7 @@ export default class WindowManager implements IWindowManager {
|
|||||||
const itemIndex = container._getIndexOfWindow(winId);
|
const itemIndex = container._getIndexOfWindow(winId);
|
||||||
if (itemIndex === -1) return;
|
if (itemIndex === -1) return;
|
||||||
|
|
||||||
const isHorizontal = container._orientation === Layout.ACC_HORIZONTAL;
|
const isHorizontal = container._orientation === 0;
|
||||||
|
|
||||||
// E/S edge → boundary after the item; W/N edge → boundary before it.
|
// E/S edge → boundary after the item; W/N edge → boundary before it.
|
||||||
let adjusted = false;
|
let adjusted = false;
|
||||||
@@ -356,7 +350,7 @@ export default class WindowManager implements IWindowManager {
|
|||||||
if (adjusted) {
|
if (adjusted) {
|
||||||
this._isTiling = true;
|
this._isTiling = true;
|
||||||
try {
|
try {
|
||||||
container.drawWindows();
|
container.tileWindows();
|
||||||
} finally {
|
} finally {
|
||||||
this._isTiling = false;
|
this._isTiling = false;
|
||||||
}
|
}
|
||||||
@@ -440,8 +434,6 @@ export default class WindowManager implements IWindowManager {
|
|||||||
for (const monitor of this._monitors.values()) {
|
for (const monitor of this._monitors.values()) {
|
||||||
monitor.tileWindows();
|
monitor.tileWindows();
|
||||||
}
|
}
|
||||||
} catch (e) {
|
|
||||||
Logger.error("_tileMonitors FAILED", e);
|
|
||||||
} finally {
|
} finally {
|
||||||
this._isTiling = false;
|
this._isTiling = false;
|
||||||
}
|
}
|
||||||
@@ -520,29 +512,6 @@ export default class WindowManager implements IWindowManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public toggleActiveContainerTabbed(): void {
|
|
||||||
if (this._activeWindowId === null) {
|
|
||||||
Logger.warn("No active window, cannot toggle tabbed mode");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const container = this._findContainerForWindowAcrossMonitors(this._activeWindowId);
|
|
||||||
if (container) {
|
|
||||||
if (container.isTabbed()) {
|
|
||||||
container.setAccordion(Layout.ACC_HORIZONTAL);
|
|
||||||
} else {
|
|
||||||
// Set the active tab to the focused window
|
|
||||||
const activeIndex = container._getIndexOfWindow(this._activeWindowId);
|
|
||||||
if (activeIndex !== -1) {
|
|
||||||
container._activeTabIndex = activeIndex;
|
|
||||||
}
|
|
||||||
container.setTabbed();
|
|
||||||
}
|
|
||||||
this._tileMonitors();
|
|
||||||
} else {
|
|
||||||
Logger.warn("Could not find container for active window");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public printTreeStructure(): void {
|
public printTreeStructure(): void {
|
||||||
Logger.info("=".repeat(80));
|
Logger.info("=".repeat(80));
|
||||||
Logger.info("WINDOW TREE STRUCTURE");
|
Logger.info("WINDOW TREE STRUCTURE");
|
||||||
@@ -562,11 +531,8 @@ export default class WindowManager implements IWindowManager {
|
|||||||
monitor._workspaces.forEach((workspace, workspaceIndex) => {
|
monitor._workspaces.forEach((workspace, workspaceIndex) => {
|
||||||
const isActiveWorkspace = workspaceIndex === activeWorkspaceIndex;
|
const isActiveWorkspace = workspaceIndex === activeWorkspaceIndex;
|
||||||
Logger.info(` Workspace ${workspaceIndex}${isActiveWorkspace && isActiveMonitor ? ' *' : ''}:`);
|
Logger.info(` Workspace ${workspaceIndex}${isActiveWorkspace && isActiveMonitor ? ' *' : ''}:`);
|
||||||
Logger.info(` Orientation: ${Layout[workspace._orientation]}`);
|
Logger.info(` Orientation: ${workspace._orientation === 0 ? 'HORIZONTAL' : 'VERTICAL'}`);
|
||||||
Logger.info(` Items: ${workspace._tiledItems.length}`);
|
Logger.info(` Items: ${workspace._tiledItems.length}`);
|
||||||
if (workspace.isTabbed()) {
|
|
||||||
Logger.info(` Active Tab: ${workspace._activeTabIndex}`);
|
|
||||||
}
|
|
||||||
this._printContainerTree(workspace, 4);
|
this._printContainerTree(workspace, 4);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -581,7 +547,7 @@ export default class WindowManager implements IWindowManager {
|
|||||||
if (item instanceof WindowContainer) {
|
if (item instanceof WindowContainer) {
|
||||||
const containsActive = this._activeWindowId !== null &&
|
const containsActive = this._activeWindowId !== null &&
|
||||||
item.getWindow(this._activeWindowId) !== undefined;
|
item.getWindow(this._activeWindowId) !== undefined;
|
||||||
Logger.info(`${indent}[${index}] Container (${Layout[item._orientation]})${containsActive ? ' *' : ''}:`);
|
Logger.info(`${indent}[${index}] Container (${item._orientation === 0 ? 'HORIZONTAL' : 'VERTICAL'})${containsActive ? ' *' : ''}:`);
|
||||||
Logger.info(`${indent} Items: ${item._tiledItems.length}`);
|
Logger.info(`${indent} Items: ${item._tiledItems.length}`);
|
||||||
Logger.info(`${indent} Work Area: x=${item._workArea.x}, y=${item._workArea.y}, w=${item._workArea.width}, h=${item._workArea.height}`);
|
Logger.info(`${indent} Work Area: x=${item._workArea.x}, y=${item._workArea.y}, w=${item._workArea.width}, h=${item._workArea.height}`);
|
||||||
this._printContainerTree(item, indentLevel + 4);
|
this._printContainerTree(item, indentLevel + 4);
|
||||||
|
|||||||
@@ -1,31 +1,37 @@
|
|||||||
.aerospike-tab-bar {
|
/* Add your custom extension styling here */
|
||||||
background-color: rgba(30, 30, 30, 0.95);
|
.active-window-border {
|
||||||
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
|
/*border: 2px solid rgba(191, 0, 255, 0.8);*/
|
||||||
spacing: 1px;
|
/*border-radius: 3px;*/
|
||||||
padding: 2px 2px 0 2px;
|
|
||||||
|
/* border-image-source: linear-gradient(to left, #743ad5, #d53a9d);*/
|
||||||
|
/* !*border: 4px solid transparent;*!*/
|
||||||
|
/* !*border-radius: 5px;*!*/
|
||||||
|
|
||||||
|
/* !*!* Gradient border using border-image *!*/
|
||||||
|
/* border-image: linear-gradient(45deg, red, orange, yellow, green, blue, indigo, violet) 1;*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.aerospike-tab {
|
/*.border-gradient-purple {*/
|
||||||
background-color: rgba(50, 50, 50, 0.8);
|
/* border-image-source: linear-gradient(to left, #743ad5, #d53a9d);*/
|
||||||
border-radius: 6px 6px 0 0;
|
/*}*/
|
||||||
padding: 2px 12px;
|
|
||||||
margin: 0 1px;
|
|
||||||
color: rgba(255, 255, 255, 0.5);
|
|
||||||
font-size: 11px;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
|
|
||||||
.aerospike-tab:hover {
|
/*@keyframes rainbow-border {*/
|
||||||
background-color: rgba(70, 70, 70, 0.9);
|
/* 0% {*/
|
||||||
color: rgba(255, 255, 255, 0.8);
|
/* border-image: linear-gradient(0deg, red, orange, yellow, green, blue, indigo, violet, red) 1;*/
|
||||||
}
|
/* }*/
|
||||||
|
/* 100% {*/
|
||||||
|
/* border-image: linear-gradient(360deg, red, orange, yellow, green, blue, indigo, violet, red) 1;*/
|
||||||
|
/* }*/
|
||||||
|
/*}*/
|
||||||
|
|
||||||
.aerospike-tab-active {
|
/*.active-window-border {*/
|
||||||
background-color: rgba(80, 80, 80, 1);
|
/* border: 4px solid transparent;*/
|
||||||
color: rgba(255, 255, 255, 1);
|
/* border-radius: 5px;*/
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.aerospike-tab-label {
|
/* !* Initial gradient border *!*/
|
||||||
font-size: 11px;
|
/* border-image: linear-gradient(0deg, red, orange, yellow, green, blue, indigo, violet, red) 1;*/
|
||||||
}
|
|
||||||
|
/* !* Apply animation *!*/
|
||||||
|
/* animation: rainbow-border 5s linear infinite;*/
|
||||||
|
/*}*/
|
||||||
Reference in New Issue
Block a user