diff --git a/.gitignore b/.gitignore index 8c1d8aa..6eedd59 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ **node_modules package-lock.json +floatbar.zip diff --git a/extension.ts b/extension.ts index 14f1825..441aff5 100644 --- a/extension.ts +++ b/extension.ts @@ -1,14 +1,9 @@ -import GLib from "gi://GLib"; import Gio from "gi://Gio"; import Meta from "gi://Meta"; -import St from "gi://St"; -import Shell from "gi://Shell"; -import * as Main from "resource:///org/gnome/shell/ui/main.js"; import { Extension } from "resource:///org/gnome/shell/extensions/extension.js"; -import { Button as PanelMenuButton } from "resource:///org/gnome/shell/ui/panelMenu.js"; import { EventEmitter } from "resource:///org/gnome/shell/misc/signals.js"; -import { SystemIndicator, QuickMenuToggle } from "resource:///org/gnome/shell/ui/quickSettings.js"; -import GObject from "gi://GObject"; +import * as Main from "resource:///org/gnome/shell/ui/main.js"; +import { Button as PanelMenuButton } from "resource:///org/gnome/shell/ui/panelMenu.js"; export default class MyExtension extends Extension { button?: PanelMenuButton; @@ -16,10 +11,17 @@ export default class MyExtension extends Extension { float: boolean = false; updateFloat: EventEmitter = new EventEmitter(); - _actorSignalIds: Map = new Map(); - _windowSignalIds: Map = new Map(); + _actorSignalIds?: Map; + _windowSignalIds?: Map; + + _workspace?: Meta.Workspace; enable() { + this._workspace = global.workspaceManager.get_active_workspace(); + + this._windowSignalIds = new Map(); + this._actorSignalIds = new Map(); + // this.button = new ToggleButton(this); // Main.panel.addToStatusArea(this.uuid, this.button); @@ -31,45 +33,55 @@ export default class MyExtension extends Extension { this._actorSignalIds.set(Main.sessionMode, [Main.sessionMode.connect("updated", () => this._updateFloating.bind(this))]); for (const window_actor of global.get_window_actors()) { - this._onWindowActorAdded(window_actor); + this._onWindowActorAdded(window_actor.get_parent(), window_actor); } - this._actorSignalIds.set(global.window_group, [ - global.window_group.connect("actor-added", this._onWindowActorAdded.bind(this)), - global.window_group.connect("actor-removed", this._onWindowActorRemoved.bind(this)), - ]); + this._workspace.connect("window-added", (workspace, window) => { + setTimeout(() => { + console.log("window-added ", window.title); + this._onWindowActorAdded.bind(this)(workspace, window.get_compositor_private()); + }, 10); + }); + this._workspace.connect("window-removed", (workspace, window) => { + setTimeout(() => { + console.log("window-removed ", window.title); + this._onWindowActorRemoved.bind(this)(workspace, window.get_compositor_private()); + }, 10); + }); this._actorSignalIds.set(global.window_manager, [global.window_manager.connect("switch-workspace", this._updateFloating.bind(this))]); } disable() { for (const actorSignalIds of [this._actorSignalIds, this._windowSignalIds]) { - for (const [actor, signalIds] of actorSignalIds) { + for (const [actor, signalIds] of actorSignalIds!) { for (const signalId of signalIds) { actor.disconnect(signalId); } } } - this._actorSignalIds.clear(); - this._windowSignalIds.clear(); + this._actorSignalIds?.clear(); + this._windowSignalIds?.clear(); this._setFloat(false); } - _onWindowActorAdded(metaWindowActor: Meta.WindowActor) { - this._windowSignalIds.set(metaWindowActor, [ + _onWindowActorAdded(container: any, metaWindowActor: Meta.WindowActor) { + if (metaWindowActor.metaWindow.skipTaskbar) return; + if (this._windowSignalIds === undefined) return; + this._windowSignalIds.set(metaWindowActor.metaWindow.title, [ metaWindowActor.connect("notify::allocation", this._updateFloating.bind(this)), metaWindowActor.connect("notify::visible", this._updateFloating.bind(this)), - metaWindowActor.connect("destroy", () => this._onWindowActorRemoved.bind(this, metaWindowActor)), ]); } - _onWindowActorRemoved(metaWindowActor: Meta.WindowActor) { - for (const signalId of this._windowSignalIds.get(metaWindowActor)) { + _onWindowActorRemoved(container: any, metaWindowActor: Meta.WindowActor) { + if (this._windowSignalIds === undefined) return; + this._updateFloating(); + for (const signalId of this._windowSignalIds.get(metaWindowActor.metaWindow.title)) { metaWindowActor.disconnect(signalId); } - this._windowSignalIds.delete(metaWindowActor); - this._updateFloating(); + this._windowSignalIds.delete("test"); } _updateFloating() { @@ -78,12 +90,6 @@ export default class MyExtension extends Extension { const windows = active_workspace.list_windows().filter((metaWindow) => { return !metaWindow.skip_taskbar && metaWindow.showing_on_its_workspace() && !metaWindow.is_hidden(); }); - for (let win of windows) { - console.log("================== Window ================"); - console.log(win.title); - console.log(win.maximizedHorizontally); //switch - } - const maximized = windows.some((metaWindow) => { return metaWindow.maximizedHorizontally; }); @@ -97,32 +103,3 @@ export default class MyExtension extends Extension { Main.panel.remove_style_class_name(float ? "solid" : "floating"); } } - -const ToggleButton = GObject.registerClass( - class ToggleButton extends PanelMenuButton { - _extension: MyExtension; - constructor(extension: MyExtension) { - super(0.0, extension.metadata.name, false); - let icon = new St.Icon({ - icon_name: "face-laugh-symbolic", - style_class: "system-status-icon", - }); - - this._extension = extension; - - this.add_child(icon); - - this.connect("button-press-event", () => this.toggleFloat()); - this.connect("touch-event", () => this.toggleFloat()); - } - - toggleFloat() { - this._extension.float = !this._extension.float; - this._extension.updateFloat.emit("update"); - this._extension._updateFloating(); - // for (const window of global.get_window_actors()) { - // console.log(window.get_parent()); - // } - } - } -); diff --git a/floatbar.zip b/floatbar.zip deleted file mode 100644 index 0eda8a0..0000000 Binary files a/floatbar.zip and /dev/null differ diff --git a/schemas/gschemas.compiled b/schemas/gschemas.compiled deleted file mode 100644 index 439a133..0000000 Binary files a/schemas/gschemas.compiled and /dev/null differ