CHANGE: working window add and remove -> error when removing set is not updated

This commit is contained in:
2024-07-01 10:12:02 +01:00
parent c7a59ca048
commit c6bedea2c3
4 changed files with 37 additions and 59 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
**node_modules
package-lock.json
floatbar.zip

View File

@@ -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<any, any> = new Map();
_windowSignalIds: Map<any, any> = new Map();
_actorSignalIds?: Map<any, any>;
_windowSignalIds?: Map<string, any>;
_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());
// }
}
}
);

Binary file not shown.

Binary file not shown.