Долгое время изучал Wiki, но на многие вопросы так и не нашел ответов, поэтому начал изучать lua код. И в результате этого изучения, родилась эта статья(перенесена на wiki). Опытные, подскажите, может где то есть возможность оптимизировать описанный код.
Панель задач - отображает по умолчанию клиенты с активного тега/тегов.
Перед началом работы скопируйте библиотеки в домашний каталог, если до сих пор этого не сделали.
mkdir -p ~/.config/awesome/themes
cp /etc/xdg/awesome/rc.lua ~/.config/awesome/rc.lua
cp -R /usr/share/awesome/lib/* ~/.config/awesome/
cp -R /usr/share/awesome/themes/* ~/.config/awesome/themes/
Вообще, за обработку панели задач отвечает файл awful/widget/tasklist.lua
Так что если возникнет желание ознакомится со всеми возможностями панели задач, изучите этот файл. Также для работы этого файла потребуются другие библиотеки lua (вызываемые оттуда функции и т.д.), они прописаны в начале файла, это те самые require. Имейте в виду, что код для 3.4 и 3.5 в библиотеке tasklist, как и названия функций в них довольно существенно отличается.
==Управление списком задач==
Для управления открытми клиентами существуют следующие клавиши:
Mod4 + Shift + r - Перерисовать активное окно.
Mod4 + m - Развернуть на весь экран.
Mod4 + n - Свернуть.
Mod4 + Control + n - Восстановить.
Mod4 + f - Полноэкранный режим.
Mod4 + Shift + c - Убить выбранный клиент.
Mod4 + t - Прикрепить поверх всех.
==Разбираем rc.lua==
Разбирая rc.lua можно обнаружить следующий код, связанный с панелью задач
mytasklist = {} --создаем таблицу панели задач
mytasklist.buttons = awful.util.table.join( --прикрепляем клавиши мыши к панели задач
awful.button({ }, 1, function (c) --нажатие левой кнопки
if c == client.focus then --свернуть/развернуть приложение
c.minimized = true
else
-- Without this, the following
-- :isvisible() makes no sense
c.minimized = false
if not c:isvisible() then
awful.tag.viewonly(c:tags()[1])
end
-- This will also un-minimize
-- the client, if needed
client.focus = c
c:raise()
end
end),
awful.button({ }, 3, function () --нажатие правой клавиши
if instance then --отображает список всех клиентов/приложений
instance:hide()
instance = nil
else
instance = awful.menu.clients({
theme = { width = 250 }
})
end
end),
awful.button({ }, 4, function () --колесо прокрутки
awful.client.focus.byidx(1) --перейти на следующий клиент
if client.focus then client.focus:raise() end
end),
awful.button({ }, 5, function () --колесо прокрутки
awful.client.focus.byidx(-1) --перейти на предыдущий клиент
if client.focus then client.focus:raise() end
end))
....
-- Create a tasklist widget - создание виджета tasklist
mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)
....
layout:set_middle(mytasklist[s]) --Располагаем список задач в центре панели
--awful.button({ }, 4, function () --колесо прокрутки
-- awful.client.focus.byidx(1) --перейти на следующий клиент
-- if client.focus then client.focus:raise() end
-- end),
--awful.button({ }, 5, function () --колесо прокрутки
-- awful.client.focus.byidx(-1) --перейти на предыдущий клиент
-- if client.focus then client.focus:raise() end
-- end))
И добавьте завершающую скобку после закомментированного кода, иначе выдаст ошибку
)
===Варианты для правой кнопки мыши===
====Закрыть приложение====
Для того, чтобы при нажатии правой кнопки мыши мы могли закрывать приложение (как в OpenBox или Tint2), а не открывать список меню, переделайте код (или закомментируйте его, если вы не планируете использовать правую клавишу для панели задач).
awful.button({ }, 3, function ()
if instance then
instance:hide()
instance = nil
else
instance = awful.menu.clients({
theme = { width = 250 }
})
end
end),
awful.button({ }, 3, function (c)
c:kill()
end ),
====Альтернативное меню====
Если вас не устраивает стандартное контекстное меню в панели задач, то вы можете его заменить, на то, которое нужно именно вам, далее приводится лишь один из возможных вариантов. Для начала заменим стандартный вызов awful.button на следующий:
awful.button({ }, 3, function (c)
if instance then
instance:hide()
instance = nil
else
instance = context_menu(c)
end
end ),
function context_menu(c)
if c.minimized then --меняем текст элемента меню в зависимости от состояния
cli_min = "Развернуть"
else
cli_min = "Свернуть"
end
if c.ontop then
cli_top = "★ Поверх всех"
else
cli_top = " Поверх всех"
end
if awful.client.floating.get(c) then
cli_float = "★ Floating"
else
cli_float = " Floating"
end
--создаем список тегов(в виде подменю), для перемещения клиента на другой тег
tag_menu = { }
for i,t in pairs(tags.names) do
if not tags[c.screen][i].selected then --удаляем из списка выбранный тег/теги
table.insert(tag_menu, { tostring(t), function() awful.client.movetotag(tags[c.screen][i]) end } )
end
end
taskmenu = awful.menu({ items = { { "Переместить на", tag_menu },
{ cli_min, function() c.minimized = not c.minimized end },
{ "Fullscreen", function() c.fullscreen = not c.fullscreen end, beautiful.layout_fullscreen },
{ cli_float, function() awful.client.floating.toggle(c) end },
{ cli_top, function() c.ontop = not c.ontop end },
{ "Закрыть", function() c:kill() end },
width = 150
} )
taskmenu:show()
return taskmenu
end
==Отобразить только иконки или текст==
Если вас не устраивает отображение текста и иконок одновременно (например вы большой любитель Unity или Win7), то можно настроить Awesome для отображения только иконок или только текста у приложений. Есть один недостаток, если для приложения не назначено иконки, то соответсвенно и отображать будет нечего (у меня такая ситуация наблюдалась с терминалом xterm, если у вас похожая ситуация, то назначьте иконку по умолчанию для приложений не имеющих собственных иконок(описано ниже).
Откройте ~/.config/awesome/awful/widget/tasklist.lua и в функции widget_tasklist_label_common() (для 3.4) или tasklist_label (для 3.5) замените return text, bg.... на следующий код:
return not theme.tasklist_only_icon and text or '', bg, status_image, not tasklist_disable_icon and c.icon or nil
Затем, создайте переменную в вашем theme.lua со следующим содержанием:
--для отображения только иконок
theme.tasklist_only_icon = true
--для отображения только текста
tasklist_disable_icon = true
Примечание: Не определяйте как одновременно обе этих переменных, иначе вы вообще не увидите своих задач.
Есть еще один способ убрать текст в Awesome 3.4 (к сожалению в 3.5 код вызываемой функции был изменен и поэтому этот способ в нем не работает), но здесь все манипуляции мы будем производить только с файлом rc.lua. Найдите следующий код:
mytasklist[s] = awful.widget.tasklist(function(c)
return awful.widget.tasklist.label.currenttags(c, s)
end, mytasklist.buttons)
mytasklist[s] = awful.widget.tasklist(function(c)
local task = { awful.widget.tasklist.label.currenttags(c, s) }
return '', task[2], task[3], task[4]
end, mytasklist.buttons)
Аналогичным способом можно удалить и иконки в Awesome 3.4. Откройте ваш rc.lua, найдите
mytasklist[s] = awful.widget.tasklist(function(c)
return awful.widget.tasklist.label.currenttags(c, s)
end, mytasklist.buttons)
mytasklist[s] = awful.widget.tasklist(function(c)
local task = { awful.widget.tasklist.label.currenttags(c, s) }
return task[1], task[2], task[3], nil
end, mytasklist.buttons)
==Иконка по умолчанию==
Для некоторых приложений не установлены иконки по умочанию (обычно это терминалы), и если вы, например, используете только иконки в панели задач, или используете отображение приложений в тегах, то приложения без иконок вы просто не увидите. Для решения этой проблемы отредактируйте функцию "tasklist_update" в файле ~/.config/awesome/awful/widget/tasklist.lua. В функции tasklist_update перед строкой table.insert вставьте следующий код:
if not c.icon then
c.icon = capi.image("path/to/icon/default_icon.png")
end
==Настройка внешнего вида==
Для настройки панели задач, в theme.lua вы можете определить следующие переменные:
===Awesome 3.5===
theme.tasklist_fg_normal - цвет текста панели задач, если значение не определено, то используется значение theme.fg_normal
theme.tasklist_bg_normal - цвет фона панели задач, если значение не определено, то используется значение theme.bg_normal
theme.tasklist_fg_focus - цвет текста активного приложения, если значение не определено, используется значение theme.fg_focus
theme.tasklist_bg_focus - цвет фона активного приложения, если значение не определено, то используется значение theme.bg_focus
theme.tasklist_fg_urgent - цвет текста «срочного» приложения, если не определено, то будет использоваться значение из theme.fg_urgent
theme.tasklist_bg_urgent цвет фона «срочного» приложения, если не определено, то будет использоваться значение theme.bg_urgent
theme.tasklist_fg_minimize - цвет текста свернутого приложения, если не определено, то будет использоваться значение из theme.fg_minimize
theme.tasklist_bg_minimize - цвет фона свернутого приложения, если не определено, то будет использоваться значение из theme.bg_minimize
theme.bg_image_normal - позволяет установить изображение для неактивных в данный момент клиентов
theme.bg_image_focus - позволяет установить фоновое изображение для активного клиента
theme.bg_image_urgent - позволяет установить фоновое изображения для «срочного» клиента
theme.bg_image_minimize - позволяет установить фоновое изображение для свернутого клиента
theme.tasklist_disable_icon - позволяет отключить отображение иконок, если значение равно true
theme.tasklist_font - шрифт для панели задач, если не определено, то будет испльзоватся шрифт из theme.font
theme.tasklist_sticky - позволяет установить текст для «липкого» клиента, если значение не установлено, то используется «▪»
theme.tasklist_ontop - позволяет установить текст/символ для приложения «поверх всех», если значение не установлено, то используется '⌃'
theme.tasklist_floating - текст для приложения в «плавающем» режиме, если значение не установлено, то используется '✈'
theme.tasklist_maximized_horizontal - текст для развернутого по горизонтали приложения, если на установлено, то используется '⬌'
theme.tasklist_maximized_vertical - текст для приложения развернутого по вертикали, если на установлено, то используется '⬍'
===Awesome 3.4===
Здесь возможностей по настройке намного меньше, это еще одна причина перейти на более новую версию.
theme.tasklist_fg_focus - цвет текста активного приложения, если значение не определено, используется значение theme.fg_focus
theme.tasklist_bg_focus - цвет фона активного приложения, если значение не определено, то используется значение theme.bg_focus
theme.tasklist_fg_urgent - цвет текста "срочного" приложения, если не определено, то будет использоваться значение из theme.fg_urgent
theme.tasklist_bg_urgent цвет фона "срочного" приложения, если не определено, то будет использоваться значение theme.bg_urgent
theme.tasklist_fg_minimize - цвет текста свернутого приложения, если не определено, то будет использоваться значение из theme.fg_minimize
theme.tasklist_bg_minimize - цвет фона свернутого приложения, если не определено, то будет использоваться значение из theme.bg_minimize
theme.tasklist_floating_icon - иконка для приложения в "плавающем" режиме
theme.tasklist_font - шрифт для панели задач, если не определено, то будет испльзоватся шрифт из theme.font
===Высота панели ===
Если вас не устраивает стандартная высота панели задач, то ее можно изменить, для этого найдите в rc.lua код отвечающий за создание контейнера mywibox и измените его следующим образом:
mywibox[s] = awful.wibox({ position = "top", height = 24, screen = s })
bottomwibox = {}
bottomwibox[s] = awful.wibox({ position = "bottom", height = 27, screen = s })
bottomwibox[s].widget = {
{
mylauncher,
layout = awful.widget.layout.horizontal.leftright
},
mytasklist[s],
layout = awful.widget.layout.horizontal.rightleft
}
==Порядок открытых приложений==
По умолчанию новое приложение отображается слева от открытых ранее. Но если вы привыкли к другому, например в Gnome или KDE, то можно настроить, чтобы вновь открываемые приложения открывались справа, т.е. список задач был отсортирован по запуску, где первым в списке будет первое открытое приложение, а последним соответственно последнее. Для этого необходимо открыть файл ~/.config/awesome/awful/widget/tasklist.lua. Все манипуляции с этими файлами лучше всего делать когда они находится в домашнем каталоге, чтобы если вы что-то испортите, можно было их легко восстановить. Итак, найдите в этом файле функцию "function tasklist_update" в ней есть следующая строка:
"'Awesome 3.4"'
table.insert(shownclients,c)
table.insert(shownclients, 1, c)
table.insert(clients, c)
table.insert(clients, 1, c)
==Ширина приложений в списке задач ==
Если вас не устраивает, то, что одно запущенное приложение можент занимать все доступное пространоство, на панели задач, то это поведение можно немного изменить. Для этого потребуется отредактировать файл ~/.config/awesome/awful/widget/tasklist.lua
===Awesome 3.4===
Найдите функцию new, в ней необхоидмо изменить
layout = layout.horizontal.flex
layout = layout.horizontal.leftright
Найдите функцию tasklist.new затем замените
local w = base_widget or flex.horizontal()
local w = base_widget or fixed.horizontal()
local fixed = require("wibox.layout.fixed")
Правда ширина каждого клиента будет зависеть от названия, в принципе это тоже можно поправить если вам требуется фиксированная ширина клиентов, для этого нужно изменить в файле tasklist.lua функцию widget_tasklist_label_common (3.4) или tasklist_label (в 3.5): В начало файла поместите
local string = string
if #name >20 then
name = string.sub(name,1,20)
end
Есть еще один ньюанс, при изменении испльзуемой схемы(layout), приложения теперь перестают масштабироваться, и в результате их теперь на панель входит штук 5, конечно это можно изменить, но изменений потребуется достаточно много и они уже выходят за рамки данной статьи.
==Список клиентов ==
По умолчанию в файле rc.lua для обработки списка клиентов для tasklist используется следующий код:
Awesome 3.5
mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)
Awesome 3.4
mytasklist[s] = awful.widget.tasklist(function(c)
return awful.widget.tasklist.label.currenttags(c,s)
end, mytasklist.button)
Awesome 3.4
awful.widget.tasklist.label.allscreen - для отображения клиентов со всех экранов
awful.widget.tasklist.label.alltags - для отображения клиентов со всех тегов текущего экрана
awful.widget.tasklist.label.currenttags - для отображения клиентов с текущего тега
awful.widget.tasklist.label.focused - для оторажения только клиентов в фокусе
Awesome 3.5
awful.widget.tasklist.filter.allscreen - для отображения клиентов со всех экранов
awful.widget.tasklist.filter.alltags - для отображения клиентов со всех тегов текущего экрана
awful.widget.tasklist.filter.currenttags - для отображения клиентов с текущего тега
awful.widget.tasklist.filter.minimizedcurrenttags - для отображения свернутых клиентов на текущем теге
awful.widget.tasklist.filter.focused - для оторажения только клиентов в фокусе
Awesome 3.5 - tasklist.lua - function tasklist_update
if not (c.skip_taskbar or c.hidden
or c.type == "splash" or c.type == "dock" or c.type == "desktop")
and filter(c, s) then
table.insert(clients, c)
end
==Сигналы==
Сигналы - это система сообщений которую рассылает ядро Awesome для управления виджетами, клиентами, тегами и т.д. Подробне ознакомится с системой сигналов вы можете [Signals/ru|здесь]. Итак, поддерживаются следующие сигналы:
tag.attached_connect_signal(screen, "property::selected", u)
tag.attached_connect_signal(screen, "property::activated", u)
capi.client.connect_signal("property::urgent", u)
capi.client.connect_signal("property::sticky", u)
capi.client.connect_signal("property::ontop", u)
capi.client.connect_signal("property::floating", u)
capi.client.connect_signal("property::maximized_horizontal", u)
capi.client.connect_signal("property::maximized_vertical", u)
capi.client.connect_signal("property::minimized", u)
capi.client.connect_signal("property::name", u)
capi.client.connect_signal("property::icon_name", u)
capi.client.connect_signal("property::icon", u)
capi.client.connect_signal("property::skip_taskbar", u)
capi.client.connect_signal("property::screen", u)
capi.client.connect_signal("property::hidden", u)
capi.client.connect_signal("tagged", u)
capi.client.connect_signal("untagged", u)
capi.client.connect_signal("unmanage", u)
capi.client.connect_signal("list", u)
capi.client.connect_signal("focus", u)
capi.client.connect_signal("unfocus", u)
u = function () tasklist_update(screen, w, buttons, filter, data, style, uf) end