AwesomeWM - Как предотвратить миграцию клиентов при отключении экрана?

После пристыковки и отстыковки ноутбука, в результате исчезновения двух экранов и появления одного экрана или наоборот, все окна мигрируют на один экран.

Как добиться следующего желаемого поведения: сохранить окна, связанные с отключенными экранами, с тегами, которые были на этих экранах, позволяя этим окнам быть невидимыми (это нормально), пока я явно не выберу перенос определенного окна на текущий экран (через lua команда/скрипт какой-то, который позволяет мне просматривать список окон). Кроме того, при обратном изменении конфигурации экрана (например, при повторной стыковке) все окна должны стать доступными, как будто никаких изменений экрана никогда не происходило. Вариант использования заключается в том, что, когда я отстыкован, мне не нужно получать доступ ко всем окнам.

Я посмотрел на no_offscreen, но это не было связано. Не совсем уверен, с чего начать.


person alexei    schedule 05.02.2017    source источник


Ответы (2)


Вам нужно реализовать обработчик request::screen для тега и переместить теги на оставшийся экран. Затем при желании добавьте фильтр списка тегов, чтобы скрыть их. Как только экран вернется, переместите теги обратно на исходный экран.

См. https://www.reddit.com/r/awesomewm/comments/5r9mgu/client_layout_not_preserved_when_switching/ для достаточно близкого примера.

Другой способ — перестать использовать «настоящие» экраны и использовать «фальшивые». Таким образом, вы можете игнорировать тот факт, что они отключены, и сохранить его, как если бы он все еще был там. Для этого требуется дополнительная механика, чтобы предотвратить наложение «настоящего» экрана на фальшивый (рецепт катастрофы).

person Emmanuel Lepage Vallee    schedule 05.02.2017

Принимая ответ Эммануэля в качестве руководства, вот что, похоже, работает для меня.

Мой screen.outputs где nil, поэтому я создал идентификатор из разрешения:

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

In 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)
person alexei    schedule 05.02.2017
comment
for i, t in pairs(s.tags) do -- not sure how else to get first elem Использование: s.tags[1] - person Emmanuel Lepage Vallee; 06.02.2017
comment
Я думаю, что код live_screen можно заменить на mouse.screen или screen.primary. Это нужно будет протестировать. - person Emmanuel Lepage Vallee; 06.02.2017