在对接和取消对接笔记本电脑后,由于两个屏幕消失,一个屏幕出现或反之亦然,所有窗口都会迁移到一个屏幕。
如何实现以下所需的行为:保持窗口与断开连接的屏幕相关联,使用这些屏幕上的标签,让这些窗口不可见(没关系),直到我明确选择将特定窗口迁移到当前屏幕(通过某种允许我浏览窗口列表的lua命令/脚本)。此外,当屏幕配置改变回来时(例如,在重新对接时),所有窗口都应该变得可访问,就像没有发生任何屏幕变化一样。用例是,在取消停靠时,我不需要访问所有窗口。
我看了no_offscreen,但似乎并没有关联。不确定从哪里开始。
答案 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)