如何更改聚焦窗口的边框颜色

问题描述 投票:0回答:1

我正在开发 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];
        })
    };
}

这段代码有效。但有一个问题。但是,当绘制多个边框时,所有边框似乎都位于所有窗口的顶部。

borders on top of all the windows

我已经检查了为侏儒窗口边框添加颜色。它说:

那是因为边框实际上并不是窗户。合成器有 不知道将它们放在堆栈的哪里,所以忽略它们。

您必须自己将它们移动到正确的层,并连接到 global.display('restacked') 信号来更新它们。

那里还有一个工作代码。

但我不知道该怎么办。给定的代码是我到目前为止所管理的所有代码,它在所有窗口的顶部给出了矩形。

我能做什么?

gnome gnome-shell gnome-shell-extensions gnome-3 gjs
1个回答
0
投票

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];
        })
    };
}

如需完整示例,请查看此处

© www.soinside.com 2019 - 2024. All rights reserved.