2017-02-05 8 views
0

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

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

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

ответ

1

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

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

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

0

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

Мои 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 

В 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) 
+0

'для i, t в парах (s.tags) do - не уверен, как еще получить первый элемент. Использование: 's.tags [1]' –

+0

Я думаю, что код 'live_screen' может быть заменен на' mouse.screen' или 'screen.primary'. Это нужно будет протестировать. –

 Смежные вопросы

  • Нет связанных вопросов^_^