AwesomeWM - 如何在屏幕断开时阻止客户端迁移?

时间:2017-02-05 20:15:52

标签: awesome-wm

在对接和取消对接笔记本电脑后,由于两个屏幕消失,一个屏幕出现或反之亦然,所有窗口都会迁移到一个屏幕。

如何实现以下所需的行为:保持窗口与断开连接的屏幕相关联,使用这些屏幕上的标签,让这些窗口不可见(没关系),直到我明确选择将特定窗口迁移到当前屏幕(通过某种允许我浏览窗口列表的lua命令/脚本)。此外,当屏幕配置改变回来时(例如,在重新对接时),所有窗口都应该变得可访问,就像没有发生任何屏幕变化一样。用例是,在取消停靠时,我不需要访问所有窗口。

我看了no_offscreen,但似乎并没有关联。不确定从哪里开始。

2 个答案:

答案 0 :(得分:1)

您需要在代码上实现request::screen处理程序,并将代码移动到剩余的屏幕。然后可选择添加标签列表过滤器以隐藏它们。屏幕返回后,将标签移回原始屏幕

请参阅https://www.reddit.com/r/awesomewm/comments/5r9mgu/client_layout_not_preserved_when_switching/以获得足够接近的示例。

另一种方法是停止使用“真实”屏幕并使用“假”屏幕。通过这种方式,您可以忽略它们已断开连接的事实,并保持它就像它仍然存在一样。这需要一些更多的机制来防止“真实”屏幕与假的屏幕重叠(灾难的处方)

答案 1 :(得分:0)

以Emmanuel的答案为指导,这里似乎对我有用。

我的screen.outputs nil,所以我从决议中创建了一个ID:

function firstkey(t) -- sorry, not a Lua programmer...
for i, e in pairs(t) do
    return i
end
return nil
end

local function get_screen_id(s)
    return tostring(s.geometry.width) .. "x" .. tostring(s.geometry.height) .. "x" .. tostring(firstkey(s.outputs))
end

awful.screen.connect_for_each_screen(function(s)

-- Check if existing tags belong to this new screen that's being added
local restored = false;
local all_tags = root.tags()
for i, t in pairs(all_tags) do
    if get_screen_id(s) == t.screen_id then
        t.screen = s
        restored = true;
    end
end

-- On restored screen, select a tag
-- If this screen is entirely brand new, then create tags for it
if restored then
    local first_tag = nil;
    for i, t in pairs(s.tags) do -- not sure how else to get first elem
        first_tag = t
        break
    end
    first_tag.selected = true
else
    -- Each screen has its own tag table.
    awful.tag({ "1", "2", "3", "4", "5", "6", "7", "8", "9" }, s, awful.layout.layoutThens[1])

    -- Assign the tag to this screen, to restore as the screen disconnects/connects
    for k, v in pairs(s.tags) do
        v.screen_id = get_screen_id(s)
    end
end

当屏幕消失时处理信号:

tag.connect_signal("request::screen", function(t)
    -- Screen has disconnected, re-assign orphan tags to a live screen

    -- Find a live screen
    local live_screen = nil;
    for s in screen do
        if s ~= t.screen then
            live_screen = s;
            break
        end
    end

    -- Move the orphaned tag to the live screen
    t.screen = live_screen
end)