Настройка макета окон для конкретного приложения в awesome-wm
Как настроить awesome, чтобы запустить новое приложение с двумя окнами, выровненными так:
----------------
|xxxxxxxxxx####|
|xxxxxxxxxx####|
|xxxxxxxxxx####|
|xxxxxxxxxx####|
----------------
где "x" - это, например, диалоговое окно в pidgin, а "#" - это окно списка контактов.
В общем, я хотел бы указать ширину правого окна и поместить его с правой стороны (максимально вертикально), а другое окно должно занимать оставшееся пространство.
У меня уже есть некоторый почти рабочий код, но он ведет себя странно (он настраивает все правильно для pidgin, но он не для gimp и v_sim, а изредка, без каких-либо известных мне причин, он изменяет геометрию левого окна. Или когда я запускаю приложение (v_sim), он не помещается в правильные позиции, и он не максимизируется по вертикали, но когда я снова перезапускаю awesome, он помещает его правильно. Поэтому я предполагаю, что это приложение что-то изменит, когда оно запустится.
Вот код, который я использую сейчас:
awful.rules.rules = {
...
{ rule = { class = "Pidgin", role = "buddy_list" },
properties = {
floating = true
},
callback = function( c )
local w_area = screen[ c.screen ].workarea
local winwidth = 340
c:struts( { right = winwidth } )
c:geometry( { x = w_area.width - winwidth, width = winwidth, y = w_area.y, height = w_area.height } )
end
},
{ rule = { class = "Pidgin", role = "conversation" },
properties = {
floating = true,
x = 0,
maximized_vertical = true,
maximized_horizontal = true
},
callback = awful.client.setslave
},
...
}
Ответы
Ответ 1
У меня была такая же проблема, но мне хотелось, чтобы окно с большим браузером слева с небольшим терминалом справа. Чтобы заставить его работать, я выделил для этой цели тег с левым макетом и отрегулировал коэффициент ширины (т.е. Операцию, обычно выполняемую CTRL-L).
Добавьте следующее в конец rc.lua, где yourtag - это тег, в который вы хотели бы разместить эти окна. Значение 0.15 можно настроить по своему вкусу.
awful.tag.viewonly(yourtag)
awful.tag.incmwfact(0.15, yourtage)
Кроме того, использование awful.client.setslave
для окна, которое вы хотите по праву, гарантирует, что они не будут переключаться.
{
rule = { class = "URxvt" },
callback = awful.client.setslave
},
Вы также можете направить определенные приложения в тег, используя свойство tag
.
{
rule = { class = "Firefox" },
properties = { tag = browse }
},
{
rule = { class = "URxvt", instance = "browse" },
properties = { tag = browse },
},
Затем я создал привязку, чтобы открыть эти приложения следующим образом.
-- Custom programs
awful.key({ modkey, "Shift" }, "b", function()
awful.tag.viewonly(browse)
awful.util.spawn_with_shell("urxvt -name browse -e newsbeuter")
awful.util.spawn("firefox")
end)
Это конечный результат:
![This is the final result.]()
Ответ 2
В качестве альтернативы вы можете использовать окно с плавающим контактом со строками.
Это не позволяет максимизировать окно списка контактов, если нет окна сообщений.
Кроме того, он позволяет размещать CL-окно рядом с произвольными (черепичными) окнами.
Отъезд: http://www.bramschoenmakers.nl/en/node/738
Хотя его реализация немного затруднительна для моей версии awesome.
Проблема заключается в том, что он не настраивается для уже установленных стоек.
Моя реализация:
{ rule = { class = "Pidgin", role = "buddy_list" },
properties = {floating=true,
maximized_vertical=true, maximized_horizontal=false },
callback = function (c)
local cl_width = 250 -- width of buddy list window
local scr_area = screen[c.screen].workarea
local cl_strut = c:struts()
-- scr_area is affected by this client struts, so we have to adjust for that
if c:isvisible() and cl_strut ~= nil and cl_strut.left > 0 then
c:geometry({x=scr_area.x-cl_strut.left, y=scr_area.y, width=cl_strut.left})
-- scr_area is unaffected, so we can use the naive coordinates
else
c:struts({left=cl_width, right=0})
c:geometry({x=scr_area.x, y=scr_area.y, width=cl_width})
end
end },
Это ставит окно CL слева и выделяет для него фиксированное пространство.
(Вам не нужно какое-либо правило для окна беседы)