diff --git a/extension.ts b/extension.ts index a503b40..98e45f5 100644 --- a/extension.ts +++ b/extension.ts @@ -53,6 +53,11 @@ export default class aerospike extends Extension { this.refreshKeybinding('join-with-right'); }); + this.settings.connect('changed::print-tree', () => { + log(`Print tree keybinding changed to: ${this.settings.get_strv('print-tree')}`); + this.refreshKeybinding('print-tree'); + }); + this.settings.connect('changed::dropdown-option', () => { log(`Dropdown option changed to: ${this.settings.get_string('dropdown-option')}`); }); @@ -88,6 +93,11 @@ export default class aerospike extends Extension { Logger.info('Keybinding 4 was pressed!'); }); break; + case 'print-tree': + this.bindKeybinding('print-tree', () => { + this.windowManager.printTreeStructure(); + }); + break; } } @@ -114,6 +124,10 @@ export default class aerospike extends Extension { this.bindKeybinding('join-with-right', () => { Logger.info('Keybinding 4 was pressed!'); }); + + this.bindKeybinding('print-tree', () => { + this.windowManager.printTreeStructure(); + }); } private bindKeybinding(settingName: string, callback: () => void) { diff --git a/schemas/org.gnome.shell.extensions.aerospike.gschema.xml b/schemas/org.gnome.shell.extensions.aerospike.gschema.xml index cdea8da..6fbc805 100644 --- a/schemas/org.gnome.shell.extensions.aerospike.gschema.xml +++ b/schemas/org.gnome.shell.extensions.aerospike.gschema.xml @@ -37,5 +37,11 @@ Keyboard shortcut for triggering action 4 + + x']]]> + Print window tree structure + Prints the current tree of containers and windows per monitor to logs + + \ No newline at end of file diff --git a/src/prefs/prefs.ts b/src/prefs/prefs.ts index 3820fd8..fad60c6 100644 --- a/src/prefs/prefs.ts +++ b/src/prefs/prefs.ts @@ -155,6 +155,15 @@ export default class AerospikeExtensions extends ExtensionPreferences { }) ); + keybindingsGroup.add( + new EntryRow({ + title: _('Print Tree Structure'), + settings: settings, + bind: 'print-tree', + map: keybindingMap + }) + ); + } diff --git a/src/wm/windowManager.ts b/src/wm/windowManager.ts index d095593..97ec27f 100644 --- a/src/wm/windowManager.ts +++ b/src/wm/windowManager.ts @@ -7,6 +7,7 @@ import * as Main from "resource:///org/gnome/shell/ui/main.js"; // import Mtk from "@girs/mtk-16"; import {Logger} from "../utils/logger.js"; import Monitor from "./monitor.js"; +import WindowContainer from "./container.js"; export interface IWindowManager { @@ -419,5 +420,54 @@ export default class WindowManager implements IWindowManager { return null; } + /** + * Prints the tree structure of all monitors, workspaces, containers, and windows to the logs + */ + public printTreeStructure(): void { + Logger.info("=".repeat(80)); + Logger.info("WINDOW TREE STRUCTURE"); + Logger.info("=".repeat(80)); + + this._monitors.forEach((monitor: Monitor, monitorId: number) => { + Logger.info(`Monitor ${monitorId}:`); + Logger.info(` Work Area: x=${monitor._workArea.x}, y=${monitor._workArea.y}, w=${monitor._workArea.width}, h=${monitor._workArea.height}`); + + monitor._workspaces.forEach((workspace, workspaceIndex) => { + Logger.info(` Workspace ${workspaceIndex}:`); + Logger.info(` Orientation: ${workspace._orientation === 0 ? 'HORIZONTAL' : 'VERTICAL'}`); + Logger.info(` Items: ${workspace._tiledItems.length}`); + + this._printContainerTree(workspace, 4); + }); + }); + + Logger.info("=".repeat(80)); + } + + /** + * Recursively prints the container tree structure + * @param container The container to print + * @param indentLevel The indentation level (number of spaces) + */ + private _printContainerTree(container: any, indentLevel: number): void { + const indent = " ".repeat(indentLevel); + + container._tiledItems.forEach((item: any, index: number) => { + if (item instanceof WindowContainer) { + Logger.info(`${indent}[${index}] Container (${item._orientation === 0 ? 'HORIZONTAL' : 'VERTICAL'}):`); + 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}`); + this._printContainerTree(item, indentLevel + 4); + } else { + const window = item.getWindow(); + Logger.info(`${indent}[${index}] Window ID: ${item.getWindowId()}`); + Logger.info(`${indent} Title: "${window.get_title()}"`); + Logger.info(`${indent} Class: ${window.get_wm_class()}`); + const rect = item.getRect(); + Logger.info(`${indent} Rect: x=${rect.x}, y=${rect.y}, w=${rect.width}, h=${rect.height}`); + } + }); + } + }