我正在开发 gnome 扩展。我正在尝试在窗口周围放置边框。
_add_orange_border_to_window = function (win) {
if (!win) return;
let actor = win.get_compositor_private().get_parent();
if (!actor) return;
if (!borders[win]) {
borders[win] = new St.Bin({
style_class: 'border'
});
actor.add_child(borders[win]);
}
const BORDERSIZE = 3;
function redrawBorder() {
let rect = win.get_frame_rect();
borders[win].set_position(rect.x - BORDERSIZE, rect.y - BORDERSIZE);
borders[win].set_size(rect.width + 2 * BORDERSIZE, rect.height + 2 * BORDERSIZE);
}
function restack(display){
actor.get_children().forEach(
(child) => {
let sibling = Meta.get_window_group_for_display(display);
sibling.set_child_above_sibling(actor, this);
}
)
}
redrawBorder();
// Connect to the size-changed and position-changed signals
signalHandlers[win] = {
sizeChangedId: win.connect('size-changed', redrawBorder),
positionChangedId: win.connect('position-changed', redrawBorder),
restackHandlerID : Display.connect('restacked', restack),
unmanagedId: win.connect('unmanaged', () => {
actor.remove_child(borders[win]);
win.disconnect(signalHandlers[win].sizeChangedId);
win.disconnect(signalHandlers[win].positionChangedId);
win.disconnect(signalHandlers[win].restackHandlerID);
win.disconnect(signalHandlers[win].unmanagedId);
delete borders[win];
delete signalHandlers[win];
})
};
}
这段代码有效。但有一个问题。但是,当绘制多个边框时,所有边框似乎都位于所有窗口的顶部。
我已经检查了为侏儒窗口边框添加颜色。它说:
那是因为边框实际上并不是窗户。合成器有 不知道将它们放在堆栈的哪里,所以忽略它们。
您必须自己将它们移动到正确的层,并连接到 global.display('restacked') 信号来更新它们。
那里还有一个工作代码。
但我不知道该怎么办。给定的代码是我到目前为止所管理的所有代码,它在所有窗口的顶部给出了矩形。
我能做什么?
Alhamdulillah,问题解决了。
let markedWindowsData = {};
_redraw_border = function (win, border) {
let rect = win.get_frame_rect();
border.set_position(rect.x, rect.y);
border.set_size(rect.width, rect.height);
}
_mark_window(win) {
if (!win) return;
let actor = win.get_compositor_private();
let actor_parent = actor.get_parent();
let border = new St.Bin({
style_class: 'border'
});
actor_parent.add_child(border);
this._redraw_border(win, border);
markedWindowsData[win] = {
win_id: win.get_id(),
border: border,
sizeChangedId: win.connect('size-changed', () => this._redraw_border(win, border)),
positionChangedId: win.connect('position-changed', () => this._redraw_border(win, border)),
restackHandlerID: Display.connect('restacked', (display) => {
let wg = Meta.get_window_group_for_display(display);
wg.set_child_above_sibling(border, actor);
}),
unmanagedId: win.connect('unmanaged', () => {
global.window_group.remove_child(border);
win.disconnect(markedWindowsData[win].sizeChangedId);
win.disconnect(markedWindowsData[win].positionChangedId);
Display.disconnect(markedWindowsData[win].restackHandlerID);
win.disconnect(markedWindowsData[win].unmanagedId);
delete markedWindowsData[win];
})
};
}
如需完整示例,请查看此处。