Настройка awesome: Классный оконный менеджер — Awesome WM / Habr – awesome (Русский) — ArchWiki

Содержание

Классный оконный менеджер — Awesome WM / Habr

Здравствуйте! Прочитав недавно статью про оконные менеджеры в Linux, мне захотелось рассказать всем о менеджере, который был там упомянут — «awesome».
Это тайлинговый windows manager для unix (linux, freebsd, openbsd, netbsd).
Описание

Awesome WM — тайлинговый wm, с возможностями быть и композитным. Это одна из его особенностей, часто пользователям требуется компактность (тайлинговая сторона этого WM), но и иногда можно и поработать в обычном режиме (композитном). Он очень легок, не нагружает процессор, и пространство экрана используется очень размерено и пустых пространств не остается (в тайлинговом режиме).
Настраивается он при помощи конфигурационного файла, на скриптовом языке Lua. Есть поддержка плагинов, которые тоже, в свою очередь, написаны на Lua.
Установка

Установить его очень просто, например на Arch Linux просто напишите
sudo pacman -S awesome vicious

Или на Debian based
sudo apt-get install awesome awesome-extra

Пакет «vicious» содержит в себе базовые плагины, которые Вы в дальнейшем можете использовать.

Далее требуется прописать его загрузки при загрузке X Window System. Это прописывается в файле, находящемся в домашнем каталоге, «.xinitrc».

#!/bin/sh

exec awesome

Перезагружаемся и появляется это wm.
Первое знакомство


Вот так выглядит ваша сессия при первом включении. Казалось бы, как в этом работать и что тут делать? На самом деле все просто, когда поймешь ее систему. Все действия с окнами выполняются с помощью хоткеев. По умолчанию они таковы (все это можно прочитать в «man awesome», сам текст взят с gentoo wiki):

super + number переход на другой тэг, где тэг это номер клавиши, точнее его положение (проводя аналогию с другими wm, тэг = вирт. рабочий стол).
super + shift + number перенести текущее окно на другой тэг.
super + j, super+k переход между окнами.
super + shift + j или

super + shift + k поменять местами два окна.
super + Space изменение отображения окон. (В awesome очень много видов отображений — тайлинговые: вертикально, горизонтально; композитные — можно мышкой таскать; приложение в фокусе на весь экран и пр.)
super + Enter запустить терминал.
super + r запуск программы.
super+shift+c закрыть окно.
super+shift+r перезапустить awesome.
super+shift+q выйти из awesome.

Несомненно кому-то они не удобны. Но ведь мы можем все изменить! Поэтому переходим к конфигурационному файлу.

Конфигурационный файл

Предупреждение, для редактирования его нужны хотя бы небольшие навыки в программировании или написании скриптов.
Глобальный конфиг файл находится в системе в «/etc/xdg/awesome/rc.lua», но его лучше не изменять, тк если он не правильный, то wm не запустится. Поэтому сделаем свой.
mkdir ~/.config/awesome
cp /etc/xdg/awesome/rc.lua ~/.config/awesome/rc.lua

И будем изменять уже непосредственно его.
Прежде всего хотелось бы изменить некоторые клавиши.
Хоткеи находятся в секции
» — {{{ Key bindings «
Изменять все просто.
modkey — это наша клавиша super (с логотипом windows на клавиатуре).
Например:
awful.key({ modkey, "Shift"   }, "q", awesome.quit),

Это строчка говорит, что super + Shift + q заставит awesome закрыться.
Допустим, мы хотим оставить тоже самое, но без shift, тогда будет
 awful.key({ modkey,  }, "q", awesome.quit),
Или например просто по клавише Esc (Это лишь пример!)
 awful.key({}, "Esc", awesome.quit),
Думаю, логика понятна.
Так, с клавишами разобрались. Теперь стоит настроить глобальные переменные.
Эта секция находится в начале. (Далее мои собственные настройки, которые вы можете, конечно же, изменить)
terminal = "terminal"
browser  = "chromium-dev"
editor = os.getenv("vim") or "vim"
editor_cmd = terminal .. " -e " .. editor

Думаю с «внутренностями» мы разобрались, пора браться за внешний вид.
Еще чуть-чуть про настройку

Все так же продолжаем работать в конфигурационном файле.
Сперва, вместо просто цифр хотелось бы переименовать наши тэги. Это находится в секции
«— {{{ Tags»
Вместо цифр просто напишите имена.
Например у меня:
tags[s] = awful.tag({ "All", "IM", "Work", "Etc", "Media"}, s, layouts[1])

Вообще про конфигурацию я написать хорошо не сумею, ведь это дело персональное. Лучше всего про это прочитать на awesome wiki. Вообще, дописав конфиг, Вы ощутите новую легкость работы с окнами. Большое количество плюшек можно найти здесь.
Вместо заключения

Хочу отметить, что данный wm идеально подойдет людям, которые часто держат в фокусе несколько окон. Так же он подойдет для слабых машин и легковесных систем, и машин с небольшими экранами (ноутбуки)
Заучив (по началу), а потом по наитию нажимая хоткеи, Вы уже не будете думать над тем, как, куда, что сделать с окном, как его разместить.
Например в awesome в одном тэге можно держать определенные окна. Например у меня в тэге IM находятся Skype и Pidgin.
Но что слова! Скриншоты!


Полноразмерный последний скриншот
Мои обои, по просьбам трудящихся.
А так же видео, демонстрирующее работу WM.

Так же прилагаю архив со своим конфигом + плагины.

Надеюсь, я заинтересовал Вас этим классным (от англ. awesome) WM, и Вы попробуете его в деле! И готов с радостью ответить и помочь в комментариях.

UPD. Всех, кто хочет поделится своей конфигурацией или посмотреть чужие, ждут на соответствующей странице вики.

awesome (Русский) — ArchWiki

Состояние перевода: На этой странице представлен перевод статьи Awesome. Дата последней синхронизации: 17 марта 2016. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Tango-preferences-desktop-locale.pngЭта статья или раздел нуждается в переводеTango-preferences-desktop-locale.png

Примечания: Оригинал статьи и в следствии перевод нуждается в исправлении. (обсуждение: Talk:Awesome (Русский)#)

С официального сайта:

«awesome — это полностью настраиваемый современный оконный менеджер для X. Он очень быстрый, расширяемый и распространяется под GNU GPLv2 лицензией.

Ориентирован на опытных пользователей, разработчиков, людей, занимающихся вычислениями и на тех, кто желает иметь полный контроль над графической средой.»

Установка

Установите awesome. Разрабатываемая версия awesome-gitAUR, считается нестабильной и может иметь различные настройки API.

Для запуска awesome из Xinitrc, добавьте exec awesome в ~/.xinitrc. Для того, чтобы использовать входящий в комплект файл xsession[broken link: invalid section], смотрите Экранный менеджер.

KDM

Создайте от суперпользователя:

/usr/share/apps/kdm/sessions/awesome.desktop
[Desktop Entry]
Name=Awesome
Comment=Tiling Window Manager
Type=Application
Exec=/usr/bin/awesome
TryExec=/usr/bin/awesome

GNOME

Вы можете настроить GNOME использовать awesome как визуальный интерфейс, но держать GNOME работющем в фоновом режиме. Для подробностей смотрите awesome wiki.

Настройка

Основанный на языке программирования lua, файл настроек находится в ~/.config/awesome/rc.lua.

Создание файла настроек

Во-первых, создайте новый каталог, необходимый в следующем шаге:

$ mkdir -p ~/.config/awesome/

Awesome попытается использовать настройки, которые содержится в файле ~/.config/awesome/rc.lua. Он не создается автоматически, поэтому скопируйте шаблон:

$ cp /etc/xdg/awesome/rc.lua ~/.config/awesome/

Синтаксис файла настроек часто изменяется при обновлении awesome. Поэтому повторите эту команду, если с awesome произошло что-то непонятное или же вы хотите изменить настройки.

Чтобы получить дополнительную информацию о настройке awesome, посмотрите Awesome 3 configuration wiki

Примеры

Примечание: Синтаксис конфигурации awesome регулярно меняется, поэтому Вам скорее всего придется изменить файл, который Вы скачаете.

Отличные примеры файлов rc.lua можно найти по следующим ссылкам:

Расширения

Несколько расширений доступных для awesome (3.5+):

РасширениеФункционал
Поверхностный просмотр всех открытых клиентов
Динамические тэги
Всплывающие уведомления
Дополнительные виджеты
Запустит программу если она не запущена, иначе перейдёт на неё

Автозапуск программ

Смотрите [1] и Автозапуск.

Выбор раскладки клавиатуры

Смотрите awesome wiki и Keyboard configuration in Xorg.

Темы оформления

Beautiful библиотека lua, которая позволяет Вам задавать темы оформления для awesome из внешних файлов. С ее помощью весьма легко изменить «на лету» цвета или обои awesome без внесения изменений в файл rc.lua.

Тема по-умолчанию содержится в /usr/share/awesome/themes/default. Скопируйте её ~/.config/awesome/themes/default и измените theme_path в rc.lua.

beautiful.init(awful.util.getdir("config") .. "/themes/default/theme.lua")

Смотрите также [2] и [3].

Обои рабочего стола

Beautiful может обрабатывать ваши обои, поэтому вам не нужно устанавливать их в ваших файлах

.xinitrc или .xsession. Это позволяет иметь конкретные обои для каждой темы.

Начиная с версии Awesome 3.5 больше не поддерживает команду awsetbg, вместо этого он имеет модуль gears. Вы можете установить обои внутри theme.lua при помощи

theme.wallpaper = "~/.config/awesome/themes/awesome-wallpaper.png" 

Чтобы загрузить обои, убедитесь, что ваш rc.lua содержит

beautiful.init("~/.config/awesome/themes/default/theme.lua")
for s = 1, screen.count() do
	gears.wallpaper.maximized(beautiful.wallpaper, s, true)
end

Для случаных обоев, добавьте [4] в rc.lua (v3.5+). Вместо этого, для автоматического извлечения изображений из данного контекста каталога [5].

Советы и рекомендации

Скрыть / показать wibox

Чтобы привязать комбинацию Modkey + b для показа/скрытия строки состояния на активном рабочем столе (как в awesome 2.3), добавьте в ваш globalkeys в rc.lua:

awful.key({ modkey }, "b", function ()
    mywibox[mouse.screen].visible = not mywibox[mouse.screen].visible
end),

Скриншот (снимок экрана)

Смотрите Дополнительные клавиши для правильного назначения кнопки PrtSc. Затем установите программу создания скриншота например scrot

Добавьте в массив globalkeys:

 awful.key({ }, "Print", function () awful.util.spawn("scrot -e 'mv $f ~/screenshots/ 2>/dev/null'") end),

Эта функция сохраняет скриншоты внутри ~/screenshots/, измените путь/папку при необходимости.

Удаление пробелов окна

Начиная с версии awesome 3.4, можно удалить небольшие зазоры между окнами; в awful.rules.rules таблице есть раздел properties, добавьте к нему

 size_hints_honor = false

Прозрачность

Смотрите composite manager.

В awesome 3.5, прозрачность окна можно установить динамически с помощью сигналов . Например, rc.lua будет содержать следующее:

client.connect_signal("focus", function(c)
                              c.border_color = beautiful.border_focus
                              c.opacity = 1
                           end)
client.connect_signal("unfocus", function(c)
                                c.border_color = beautiful.border_normal
                                c.opacity = 0.7
                             end)
Conky

If using conky, you must set it to create its own window instead of using the desktop. To do so, edit ~/.conkyrc to contain

own_window yes
own_window_transparent yes
own_window_type desktop

Otherwise strange behavior may be observed, such as all windows becoming fully transparent. Note also that since conky will be creating a transparent window on your desktop, any actions defined in awesome’s rc.lua for the desktop will not work where conky is.

wibox’ы

Начиная с версии Awesome 3.1, есть встроенная поддержка псевдо-прозрачности. Чтобы задействовать её, добавьте 2 шестнадцатеричные цифры к цветам в вашем файле темы (~/.config/awesome/themes/default, который, как правило, копия /usr/share/awesome/themes/default), как показано здесь:

bg_normal = #000000AA

где «AA» это значение прозрачности.

Чтобы изменить прозрачность для фактического выбранного окна, нажмите Modkey + PgUp/PgDownвы также можете использовать transset-df и следующие изменения в вашем rc.lua:

globalkeys = awful.util.table.join(
    -- Ваше сочетание клавиш
    [...]
    awful.key({ modkey }, "Next", function (c)
        awful.util.spawn("transset-df --actual --inc 0.1")
    end),
    awful.key({ modkey }, "Prior", function (c)
        awful.util.spawn("transset-df --actual --dec 0.1")
    end),
    -- Другое ваше сочетание клавиш
    [...]
)
ImageMagick

You may have problems if you set your wallpaper with imagemagick’s display command. It does not work well with xcompmgr. Please note that awsetbg may be using display if it does not have any other options. Installing habak, feh, hsetroot or whatever should fix the problem (grep -A 1 wpsetters /usr/bin/awsetbg to see your options).

Передача информации виджетам при помощи awesome-client

Вы можете легко передать текст виджету. Для этого создайте новый виджет:

mywidget = widget({ type = "textbox", name = "mywidget" })
mywidget.text = "initial text"

Для обновления текста из внешнего источника, используйте awesome-client:

echo -e 'mywidget.text = "new text"' | awesome-client

Не забудьте добавить виджет в раздел wibox Вашего файла настроек.

Использование другой панели с awesome

Если вам нравится в awesome все, кроме того, как выглядит стандартная панель, то пришло время установить другую, например xfce4-panel. Конечно, другие панели тоже подойдут. Затем добавьте его в секцию autorun вашего rc.lua. Вы можете также закомментировать секцию, которая создает wibox’ы для каждого экрана (начиная с mywibox[s] = awful.wibox({ position = "top", screen = s })) но это не так необходимо. Не забудьте проверить ваш rc.lua на наличие ошибок, введя:

$ awesome -k rc.lua

Вы должны также изменить modkey+R данное сочетание клавиш, чтобы запустить другое приложение запуска вместо встроенного в awesome. Для примеров смотрите List of applications#Application launchers. Не забудьте добавить:

      properties = { floating = true } },
    { rule = { instance = "$ваше_запускаемое_приложение" },

в ваш rc.lua.

Каталоги приложений в строке меню

awesome содержит menubar. По умолчанию, нажав Mod+p откроется меню приложений, подобно dmenu в верхней части экрана. Тем не менее, это меню только ищет файлы .desktop в /usr/share/applications и /usr/local/share/applications.

Чтобы изменить это, добавьте следующую строку в rc.lua, в идеале, в разделе Menubar configuration:

app_folders = { "/usr/share/applications/", "~/.local/share/applications/" }

Следует заметить что файлы .desktop перечитываются каждый раз, при запуске awesome, тем самым замедляя запуск. IЕсли вы предпочитаете другие средства запуска программ, то строка меню может быть отключена в rc.lua путём удаления local menubar = require("menubar") и дургих ссылок на переменную menubar.

Всплывающие меню

Существует простое меню в awesome 3, — упрощённое пользовательское меню. [6] Если вы хотите меню freedesktop.org, смотрите тут awesome-freedesktop. Смотрите примеры для awesome3 [7].

Меню приложений

Если вы предпочитаете видеть более традиционное меню приложений, когда вы щёлкаете по иконке Awesome, или делаете щелчёк правой кнопкой мышки по пустому участку рабочего стола, вы можете воспользоваться инструкциями приведёнными в Xdg-menu#Awesome. Однако это меню не обновляется при добавлении или удалении программ. Поэтому не забывайте выполнять команду для обновления вашего меню. Она может выглядеть примерно так:

 xdg_menu --format awesome --root-menu /etc/xdg/menus/arch-applications.menu >~/.config/awesome/archmenu.lua

Заголовки окон (titlebars )

Включить заголовки окон в awesome легко, просто установите в файле настроек переменную titlebars_enabled в true. Тем не менее, вы можете захотеть иметь возможность включения или отключения заголовков окон. Для этого вы можете назначить горячие клавиши:

awful.key({ modkey, "Control" }, "t",
   function (c)
       -- toggle titlebar
       awful.titlebar.toggle(c)
   end)

Сначала скройте строки заголовков. Для этого добавьте сразу после создания строки заголовка:

awful.titlebar.hide(c)

Уведомление состояния батареи

Смотрите [8] простое уведомление о состоянии батареи в rc.lua. Заметьте что этому способу нужны возможности для уведомлений (установленные по умолчанию в версии3.5). Другой пример доступен в wiki awesome

Решение проблем

Нахождение и устранение ошибок rc.lua

Xephyr позволяет запускать X вложенный в окно клиента другого Х. Это позволяет отлаживать rc.lua не нарушая текущего рабочего стола. Начните с копирования rc.lua в новый файл (например rc.lua.new), и изменяйте его по мере необходимости. Затем запустите новый экземпляр awesome в Xephyr, подставляя файл настроек rc.lua.new как тут:

$ Xephyr :1 -ac -br -noreset -screen 1152x720 &
$ DISPLAY=:1.0 awesome -c ~/.config/awesome/rc.lua.new

Преимущество такого способа заключается в том, что вы не нарушите работу текущего рабочего стола awesome, избежите потенциальный сбой приложений X и потерю работоспособности. После того, как вы удовлетворены новыми настройками, скопируйте rc.lua.new в rc.lua и перезапустите awesome.

awmtt

awmttAUR (Awesome WM Testing Tool — Утилита тестирования Awesome WM) представляет собой простую оболочку скрипта Xephyr. По умолчанию, он будет использовать ~/.config/awesome/rc.lua.test. Если он не может найти тестовый файл,он будет использовать ваш фактический rc.lua. Вы также можете указать местоположение файла настроек, который вы хотите проверить:

$ awmtt start -C ~/.config/awesome/rc.lua.new

Когда вы закончите тестирование, закройте окно:

$ awmtt stop

Или сразу смотрите изменения, которые вы делаете в файл настроек с помощью следующей команды:

$ awmtt restart

Файл журналов

Если вы используете LightDM, awesome будет записывать ошибки в `$HOME/.xsession-errors`. Если вы используете .xinitrc для запуска awesome, эта запись FAQ будет полезной.

Клавиша Mod4

Awesome рекомендует переназначить mod4, которой по умолчанию является Win key. Если по какой-то причине она не распознаётся как mod4, используйте xmodmap чтобы узнать её. Для того чтобы изменить назначение, воспользуйтесь xev, чтобы найти код клавиши и имя клавиши для сопоставления. Затем добавьте нечто похожее в ~/.xinitrc

xmodmap -e "keycode 115 = Super_L" -e "add mod4 = Super_L"
exec awesome

В этом случае проблемой является то, что иногда xorg распознаёт код клавиши 115 неправильно, как клавишу ‘Select’. Приведенная выше команда явно перераспределяет код ключа 115 на корректную клавишу ‘Super_L’.

Для того, чтобы переназначить mod4 с помощью setxkbmap (конфликтует с xmodmap) смотрите:

tail -50 /usr/share/X11/xkb/rules/evdev

Для установки клавиши caps lock как mod4 добавьте следующую строку в ~/.xinitrc:

setxkbmap -option caps:hyper
Клавиша Mod4 против пользователей IBM ThinkPad

IBM ThinkPad не поставлялись с кнопкой Win (хотя компания Lenovo уже изменила этой традиции). Кнопка Alt по-умолчанию не используется в комбинациях, описанных в rc.lua. Это позволит Вам заменить ею кнопку Win. Чтобы сделать это, необходимо отредактировать rc.lua, заменив:

modkey = "Mod4"

на:

modkey = "Mod1"

Примечание: В awesome используются несколько сочетаний клавиш типа Mod4 + буква на клавиатуре. Изменив Mod4 на Alt, Вы можете получить наложение некоторых сочетаний. Эти сочетания придется также перебросить на другие кнопки.

Если Вы не хотите менять стандартные сочетания для awesome, Вы можете использовать другую кнопку. Например, Caps Lock используется нечасто, поэтому можно использовать ее в качестве Mod4. Измените ~/.Xmodmap:

clear lock 
add mod4 = Caps_Lock

и (пере)загрузите файл. Это действие изменит Caps Lock на кнопку Mod4 и Вы сможете воспользоваться стандартными настройками awesome. Вдобавок, это позволит использовать Caps Lock как Mod4 и в других X-приложениях.

Recent updates of xorg related packages break mentioned remapping the second line can be replaced by (tested on a DasKeyboard and IBM Model M and xorg-server 1.14.5-2):

keysym Caps_Lock = Super_L Caps_Lock

Исправление для Java приложений (серый интерфейс)

Смотрите awesome wiki и [9].

Eclipse: невозможно изменить размер/переместить главное окно

Если главное окно «прилипло» и вы не можете переместить его или изменить размер (используя mod4 + левую/правую клавишу мыши) отредактируйте workbench.xml и установите fullscreen/maximized в значение false (если оно установлено), уменьшите цифру ширины и высоты на меньшую, чем размер одного вашего экрана рабочего стола.

workbench.xml можно найти в eclipse_workspace/.metadata/.plugins/org.eclipse.ui.workbench/. Отредактируйте строку:

<window maximized="true" x="xx" y="xx"

YouTube: полноэкранный режим показывает как в фоновом режиме

Если видео с YouTube появляется под вашим браузером в полноэкранном режиме, или скрывается под панелью управления, то добавьте в rc.lua

{ rule = { instance = "plugin-container" },
  properties = { floating = true } },

Для Chromium

{ rule = { instance = "exe" },
  properties = { floating = true } },

или:

{ rule = { role = "_NET_WM_STATE_FULLSCREEN" },
  properties = { floating = true } },

Смотрите [10].

Запретить колесу прокрутки мыши менять теги

В вашем rc.lua, измените раздел Mouse Bindings на следующий;

-- {{{ Mouse bindings
root.buttons(awful.util.table.join(
    awful.button({ }, 3, function () mymainmenu:toggle() end)))
-- }}}

Запуск консольных клиентов на определённом теге

Это не работает, когда консольное приложение запускается из терминала GTK (например LXTerminal). URxvt как известно работает.

Не работает мышка в не латинской раскладке клавиатуры

Сразу после установки Awesome, или после обновления системы, вы вероятно сталкивались с такой проблемой. Мышка не работает в не латинской раскладке клавиатуры (например при Русской раскладки клавиатуры, щелчки мышью по тэгам не обрабатываются, также вы не можете вызвать меню Awesome). Смотрите подробно об этой ошибке (Англ.). Для решения этой проблемы, отредактируйте файл /usr/share/X11/xkb/compat/basic, и закомментируйте (при помощи //) в нём эти строки, как указано ниже:

//group 2 = AltGr;
//group 3 = AltGr;
//group 4 = AltGr;

Смотрите также

Awesome WM. Настройка, темизация и подключение виджетов(плагинов)

Привет, уважаемый читатель!

Сегодня я тебе расскажу об замечательном тайловом оконном менеджере окон Awesome. Когда-то я считал что учитывая современные мощности компьютеров, использовать тайловый легкий WM(window manager) просто глупо. И я ошибался ведь! Использование тайловых оконных менеджеров очень сильно экономит время! Ведь почему многие предпочитают консоль когда уже с ней познакомились? А потому что проще набрать 1 команду не отрываясь от клавиатуры чем клацать мышкой 20 раз в 20 разных окнах! Это не просто экономия, это быстро, просто и удобно! А главное… вызывает привыкание!

Awesome WM

Awesome — динамический оконный менеджер для X Window System. Его разработка началась в сентябре 2007 года в результате ответвления от dwm. Это миниатюрный и быстрый оконный менеджер, поддерживающий несколько вариантов расположения окон (например, «плавающий», когда положение окон не фиксируется, и пользователь может перетаскивать их, как в большинстве популярных менеджеров). Awesome, как фреймовый оконный менеджер, стремится предоставить всё необходимое для полного управлениями окнами без помощи мыши.
Awesome доступен для многих Unix-подобных ОС, таких как Linux, FreeBSD, NetBSD и OpenBSD.

Если Вы еще не выбрали VPS/VDS

Список неплохих конфигураций можно найти и заказать тут.

Постоянный контроль доступности вашего сервера

Для контроля на работоспособность вашего сервера используйте следующий сервис ping-admin

Как может выглядеть Awesome?

Пример 1

Пример 2

Предисловие

Ввиду того что недавно обновил Gnome 3 и он упал, времени ковырять его у меня уже не было, да и к слову, люблю когда есть резервный легкий WM, обьяснять почему думаю нужды нет. Итак, поковырявшись с i3 и еще несколькими тайловыми WM вернулся к Awesome. Разницы в управлении между тайловыми менеджерами почти нету, во многих из них используются по умолчанию одни и те же комбинации клавиш. К примеру:
WinKey(клавиша с эмблемой Windows) — у меня модификатор.
WinKey+Enter — вызов консоли.
WinKey+1(,2,3,4,5,6) — переключение на соответствующий рабочий стол.
WinKey+Shift+1(,2,3,4,5,6) — перенести активное окно на соответствующий номеру рабочий стол.
WinKey+Ctrl+r — перезагрузить среду перечитав конфиг(происходит без выхода из WM)

Так как моя статья скорее всего не будет находиться в Top — 10 статей с которыми вы скорее всего уже столкнулись по Awesome я расскажу только то что в большинстве из них практически не освещается.

Настройка Awesome

В Debian-e конфиг по умолчанию находиться в /etc/xdg/rc.lua, копируем его в домашнюю директорию в папку ~/.config/awesome/
У нас в списке пакетов упомянуты awesome(сам WM) и awesome-extras(дополнительные виджеты), последние мы то и будем подключать в конфиге.
Итак, сам конфиг как Вы могли заметить — Lua скрипт. Для меня без знаний Lua он оказался по началу достаточно сложным в понимании, но если не пытаться то ничего и не получится. На текущий момент найти какую-нибудь более-менее обьясняющую в рунете статью по добавлению виджетов я не смог. Но найти нормальную описаловку все же мог, это оказался ридми самого пакета виджетов vicious(к слову сказать сам ридми в дистре оказался отличительным от данного):
http://git.sysphere.org/vicious/tree/README
Изменения в конфиге проверяем комбинацией клавиш: WinKey+Ctrl+r.
Итак, добавим несколько виджетов(загрузка CPU, заряд батареи и громкость):

require("vicious") -- подключаем виджеты vicious
-- Initialize widget
-- Виджеты размещаются по сути в текстовом поле  и выводят символы, но могут так же рисовать график. Создали сами виджеты.
cpuwidget = widget({ type = "textbox" })
batwidget = widget({ type = "textbox" })
volumewidget = widget({ type = "textbox"})
-- Register widget
-- регистрируем виджет(название выше созданного виджета, его тип в библиотеке vicious(можно посмотреть в
-- /usr/share/awesome/lib/vicious/widgets), вывод(весь вывод обычно идет в переменных $1, $2, $3 и т.д., для каждого виджета свой
-- набор переменных которые вы можете посмотреть в ридми к каждому конкретному виджету), доп. параметры для каждого
--

Awesome tasklist / Habr

На Wiki, к сожалению, очень мало информации по настройке оконного менеджера Awesome. Поэтому решил внести свои пять копеек в популяризацию этого замечательного WM. В этой статье разбираем панель задач.

Панель задач — отображает по умолчанию клиенты с активного тега/тегов.

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

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 найдите функцию awful.key отвечающую за нужные вам клавиши и измените их.

Разбираем 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 ),

Затем где нибудь в начале файла rc.lua добавьте функцию context_menu:

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 })

Здесь вы можете изменить ее расположение, top — сверху, bottom — снизу. height — это высота панели. Или даже можете создать себе вторую панель, переместив панель задач сверху вниз(на примере 3.4):

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)

Awesome 3.5
table.insert(clients, c)

Замените ее на:
table.insert(clients, 1, c)

Перезапустите Awesome.
Ширина приложений в списке задач

Если вас не устраивает, то, что одно запущенное приложение можент занимать все доступное пространоство, на панели задач, то это поведение можно немного изменить. Для этого потребуется отредактировать файл ~/.config/awesome/awful/widget/tasklist.lua

Awesome 3.4
Найдите функцию new, в ней необхоидмо изменить:

layout = layout.horizontal.flex

На тот вариант расположения виджетов, который вас устраивает. Их полный список находится в файлах awful/widget/layout horizontal.lua и vertical.lua:

layout = layout.horizontal.leftright

Awesome 3.5
Найдите функцию tasklist.new затем замените:

local w = base_widget or flex.horizontal()

Например следующим кодом:

local w = base_widget or fixed.horizontal()

А в начало файла добавьте:

local fixed = require("wibox.layout.fixed")

Если предоженный вариант вас не устраивает, можете поэкспериментировать с layout’ами, они находятся в каталоге ~/.config/awesome/wibox/layout

Правда, ширина каждого клиента будет зависеть от названия, в принципе, это тоже можно поправить, если вам требуется фиксированная ширина клиентов, для этого нужно изменить в файле tasklist.lua функцию widget_tasklist_label_common (3.4) или tasklist_label (в 3.5):

В начало файла поместите:

local string = string

Затем перед строкой »if capi.client.focus == c then» поместите следующий код:

if #name >20 then
    name = string.sub(name,1,20)
end

Здесь мы ограничиваем название 20-ю символами, если вам требуется другое значение, измените его.

Есть еще один ньюанс, при изменении испльзуемой схемы(layout), приложения теперь перестают масштабироваться, и в результате их теперь на панель входит штук 5, конечно это можно изменить, но изменений потребуется достаточно много и они уже выходят за рамки данной статьи.

Список клиентов

По умолчанию в файле rc.lua для обработки списка клиентов и их отображения в контекстном меню используется следующий код:

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

Похожий код используется и в 3.4, но без строки »and filter(c, s)». Т.е. здесь мы пропускаем часть клиентов, если какие то из них вам все же нужны, удалите код отвечающий за них.

Сигналы

Сигналы — это система сообщений которую рассылает ядро Awesome для управления виджетами, клиентами, тегами и т.д. Подробне ознакомится с системой сигналов вы можете здесь.

Итак, поддерживаются следующие сигналы:

    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)

Названия сигналов говорят сами за себя, единственное, первые 2 улавливают события от тегов, для того, чтобы при смене тега отобразить актуальный список клиентов на нем. После того, как будет принято данное событие будет вызвана функция u:

u = function () tasklist_update(screen, w, buttons, filter, data, style, uf) end

Т.е. панель задач будет обновлена. Так что если вы где то будете менять какое то свойство для клиента, можете не беспокоиться, оно будет отловлено и корректно обработано. Если же нужного вам сигнала здесь нет, то вы всегда можете создать свой.

Ссылки

Xephyr — позволяет открывать Awesome в новом Х-сервере. Т.е. если вы периодически экспериментируете с исходниками, то для экспериментов используйте Xephyr.
Radical — мощная и расширяемя система меню.
Hints — оконные подсказки для фокусировки на окне.

Моё знакомство с WM Awesome. Часть 3 / Habr

Третья часть моего поста (предыдущую можно найти тут)

В этом кусочке назначаем кнопки мыши и клавиатуры. Небольшое примечание: для Mod4 + PrntScr я назначил делать скриншот выделенной области, а на просто PtntScrn скриншот всего экрана, но второй случай не работает — не доходят руки разобраться (для скриншотов вам понадобится установить пакет xsnap

Назначение кнопок и комбинаций
-----------------------------------
--- Назначения мыши ---
-----------------------------------
root.buttons(awful.util.table.join(
   -- Правая кнопка - вызов меню
   awful.button({ }, right_button, function() main_menu:toggle() end),
   -- Боковые кнопки - переключение тэгов по порядку
   awful.button({ }, plus_button, awful.tag.viewnext ),
   awful.button({ }, minus_button, awful.tag.viewprev )
))

-------------------------------------------
--- Назначения клавиатуры ---
-------------------------------------------
-- Глобальные назначения клавиш
globalkeys = awful.util.table.join(
  -- Переключение рабочих столов
  awful.key( { modkey,			}, key_Left, awful.tag.viewprev ),
  awful.key( { modkey,			}, key_Right, awful.tag.viewnext ),
  awful.key( { modkey,			}, key_Esc, awful.tag.history.restore ),
  --awful.key( {                          }, key_Alt_R, function () kbdcfg.switch() end),
  -- Манипуляция областями экрана (перестановка клиентов)
  awful.key( { modkey,			}, key_Tab,
  function()
    awful.client.focus.history.previous()
    if client.focus then client.focus:raise() end
  end ),
  -- Запуск стандартных программ
  -- Терминал
  awful.key( { modkey,			}, key_X, function() awful.util.spawn(terminal) end ),
  -- Командная строка
  awful.key( { modkey,			}, key_R, function() bottom_prompt_box[mouse.screen]:run() end ),
  awful.key( { 		 	        }, key_Home, function() awful.util.spawn_with_shell("google-chrome-stable") end ),
  -- Перезапуск awesome
  awful.key( { modkey,	"Control"	}, key_R, awesome.restart),
  awful.key( { modkey                   }, key_F1, function () awful.util.spawn('slimlock') end),
  awful.key( {        	                }, key_Print,
	  function () awful.util.spawn_with_shell("DATE=`date +%d%m%Y_%H%M%S`; xsnap -file $HOME/Snapshots/snap$DATE") end),
  awful.key( { modkey  	                }, key_Print,
	  function () awful.util.spawn_with_shell("DATE=`date +%d%m%Y_%H%M%S`; xsnap -nogui -file $HOME/Snapshots/snap$DATE") end),
  awful.key( {			        }, key_Vol_Up, function () volumecfg.up() end),
  awful.key( { 			        }, key_Vol_Down, function () volumecfg.down() end),
  awful.key( {                          }, key_Mute, function () volumecfg.toggle() end)
)

------------------------------------------------------
--- Клиентские назначения клавиш ---
------------------------------------------------------
clientkeys = awful.util.table.join(
  -- РАзвернуть на весь экран
  awful.key( { modkey,			}, key_F, 	function(c) c.fullscreen = not c.fullscreen end ),
  -- Закрыть окно
  awful.key( { modkey,	"Shift"		}, key_C, 	function(c) c:kill() end ),
  -- Перевести окно  в плавающий режим
  awful.key( { modkey,	"Control"	}, key_Space, 	awful.client.floating.toggle ),
  -- Сделать данной клиентское окно главным
  awful.key( { modkey,	"Control"	}, key_Return, 	function(c) c:swap( awful.client.getmaster() ) end ),
  -- Переместить окно на другой экран???
  awful.key( { modkey,			}, key_O, 	awful.client.movetoscreen ),
  -- Поместить окно поверх всех
  awful.key( { modkey,			}, key_T, 	function(c) c.ontop = not c.ontop end ),
  -- Минимизировать окно
  awful.key( { modkey,			}, key_N,
  function(c)
    c.minimized = true
  end ),
  -- Максимизировать окно
  awful.key( { modkey,			}, key_M,
  function(c)
    c.maximized_horizontal = not c.maximized_horizontal
    c.maximized_vertical = not c.maximized_vertical
  end )
)

Здесь определены некоторые комбинации для тегов, роли и сигналы. Например пиджин у меня открывается только на 4 теге, а в сигнала я прописываю — отображать у окон кнопку развернуть, закрыть, иконку и заголовок окна.

Комбинации для окон, правила и сигналы
-----------------------------------------------------------------------------------------------------------------------
--- Переключение тэгов и операции с клиентами и тэгами на каждом из экранов ---
-----------------------------------------------------------------------------------------------------------------------
for i = 1, 9 do
  -- modkey + <номер тэга>
  -- Переключиться в выбранный тэг
  globalkeys = awful.util.table.join( globalkeys,
    awful.key({ modkey }, "#" .. i + 9,
    function()
	local screen = mouse.screen
	local tag = awful.tag.gettags(screen)[i]
	if tag then
	  awful.tag.viewonly(tag)
	end
    end),
    -- modkey + Ctrl + <номер тэга>
    -- Совместить выбранный тэг с текущим
    awful.key({ modkey, "Control" }, "#" .. i + 9,
    function()
	local screen = mouse.screen
	local tag = awful.tag.gettags(screen)[i]
	if tag then
	  awful.tag.viewtoggle(tag)
	end
    end),
    -- modkey + <номер тэга>
    -- Переместить клиент в фокусе на выбранный тэг
    awful.key({ modkey, "Shift" }, "#" .. i + 9,
    function()
	local tag = awful.tag.gettags(client.focus.screen)[i]
	if client.focus and tag then
	  awful.client.movetotag(tag)
	end
    end),
    -- modkey + <номер тэга>
    -- Переместить клиент в фокусе на выбранный тэг, оставив его и в текущем тэге
    awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
    function()
	local tag = awful.tag.gettags(client.focus.screen)[i]
	if client.focus and tag then
	  awful.client.toggletag(tag)
	end
    end)
  )
end

----------------------------------------------------------------------------
--- Назначение кнопок мыши для каждого клиента ---
----------------------------------------------------------------------------
clientbuttons = awful.util.table.join(
  -- Переключить фокус
  awful.button( { }, left_button, function(c) client.focus = c; c:raise() end),
  -- Переместить
  awful.button( { modkey }, left_button, awful.mouse.client.move),
  -- Изменить размер
  awful.button( { modkey }, right_button, awful.mouse.client.resize)
 )


-- Задать глобальные клавиши
root.keys(globalkeys)

----------------------------------
--- Роли приложений ---
----------------------------------
awful.rules.rules = {
  { -- Главная роль для всех приложений
    rule = { },
    properties = { border_width = beautiful.border_width, -- задается толщина рамки окна
		   border_color = beautiful.border_normal, -- цвет рамки окна не в фокусе
		   focus = awful.client.focus.filter, -- это что не знаю :(
		   keys = clientkeys, -- горячие клавиши
		   buttons = clientbuttons} -- кнопки мыши
  },
  --{ rule = { class = "MPlayer" },
  --   properties = { floating = true } },
   --{ rule = { class = "pinentry" },
  --   properties = { floating = true } },
   --{ rule = { class = "Gimp" },
  --   properties = { floating = true } },
   -- Set Firefox to always map on tags number 5 of screen 1.
   --{ rule = { class = "Firefox" },
  --   properties = { tag = tags[1][5] } }
-- "Коньки": без рамки и плавать
  {
    rule = { class = "Conky"},
    properties = { border_width = 0, floating = true }
  },
  {
    rule = { instance = "Pidgin" },
    properties = { tag = tags[1][4], floating = false, maximized_horizontal = false, maximized_vertical = false }
  },
  {
    rule = { instance = "Skype" },
    properties = { floating = true, maximized_horizontal = false, maximized_vertical = false }
  }
}

--------------------
--- Сигналы ---
--------------------
client.connect_signal("manage", 
   function (c, startup)
   -- Enable sloppy focus
      c:connect_signal("mouse::enter", 
      function(c)
         if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
         and 
            awful.client.focus.filter(c) 
         then
            client.focus = c
         end
      end)
      if
         not startup 
      then
         -- Set the windows at the slave,
         -- i.e. put it at the end of others instead of setting it master.
         -- awful.client.setslave(c)
         -- Put windows in a smart way, only if they does not set an initial position.
         if
            not c.size_hints.user_position 
         and 
            not c.size_hints.program_position 
         then
            awful.placement.no_overlap(c)
            awful.placement.no_offscreen(c)
         end
      end
end)

-- У окон в фокусе
client.connect_signal("focus",
   function(c)
    -- Раскрасить рамку соответствеено
    c.border_color = beautiful.border_focus
    -- Нарисовать заголовок окна
    -- Виджет слева от заголовка окна
    local left_layout = wibox.layout.fixed.horizontal()
    left_layout:add(awful.titlebar.widget.iconwidget(c))
    -- Виджеты в правой части заголовка окна
    local right_layout = wibox.layout.fixed.horizontal()
    --right_layout:add(kbdcfg.widget)
    right_layout:add(awful.titlebar.widget.maximizedbutton(c))
    right_layout:add(awful.titlebar.widget.closebutton(c))
    -- Заголовок окна
    local middle_layout = wibox.layout.flex.horizontal()
    local title = awful.titlebar.widget.titlewidget(c)
    title:set_align("center")
    middle_layout:add(title)
    -- Расставляем блоки виджетов по местам
    local layout = wibox.layout.align.horizontal()
    layout:set_left(left_layout)
    layout:set_right(right_layout)
    layout:set_middle(middle_layout)
    -- Добавляем их на заголовок окна
    awful.titlebar(c):set_widget(layout)
    -- Задаем размер заголовка окна
    awful.titlebar(c, {size = 18})
   end)
client.connect_signal("unfocus",
   function(c)
    c.border_color = beautiful.border_normal
    awful.titlebar(c, {size = 18})
   end)

Переключение раскладок.

Сразу скажу, что стоит откатиться xkbcomp до версии 1.2.3, так как в 1.2.4 есть баг (при переключении раскладки, не работают кнопки мыши)

Про раскладку вообще, можно добавить реализацию как это в gentoo wiki написанно, но тогда у нас не буду работать горячии клавиши (для системных мы указывали коды клавиш, так что это нам не страшно), а вот такие как ctrl + C и т.д. работать не будут.

в новых версиях Xorg сервера убрали xorg.conf, теперь конфигурация лежит в другом месте. Создадим директорию
sudo mkdir /etc/X11/xorg.conf.d

И в ней создадим 2 файла, 01-keyboard-layout.conf и 01-enable-pointerkeys.conf
В первом:

Section "InputClass"
	Identifier             "keyboard-layout"
	MatchIsKeyboard        "on"
	Option "XkbLayout" "us,ru"
	Option "XkbOptions" "grp:ctrl_shift_toggle,terminate:ctrl_alt_bksp
EndSection

Перезапуск X сервера комбинацией ctrl + alt + backspace и смена раскладки с помощью ctrl + shift

После смены раскладки у нас по умолчанию отключаются кнопки мыши, по этому для их включения запишем во втором (при версии xkbcomp-1.2.4 это не работает):

Section "InputClass"
    Identifier             "Keyboard Defaults"
    MatchIsKeyboard        "yes"
    Option                 "XkbOptions" "keypad:pointerkeys"
EndSection

Теперь сделаем приятным для глаз наш urxvt, для этого отредактируем файлик ~/.Xdefaults (опять таки, если его нету — смело создаём)

Мой ~/.Xdefaults
!darkgray
*background:		#212121

!silver
*foreground:		#C0C0C0

!black
*color0:		#251f1f
*color8:		#5e5e5e
!red
*color1:		#eb4509
*color9:		#eb4509
!green
*color2:		#94e76b
*color10: 		#95e76b
!yellow
*color3:		#ffac18
*color11: 		#ffac18
!blue
*color4:		#46aede
*color12:		#46aede
!magenta
*color5:		#e32c57
*color13:		#e32c57
!cyan
*color6:		#d6dbac
*color14:		#d6dbac
!white
*color7:		#efefef
*color15:		#efefef

!save 5000 lines
URxvt*saveLines:	5000	

!left button
URxvt.matcher.button:   1	

!default brauser google chrome
URxvt.urlLauncher:	google-chrome-stable
!underline links
URxvt.underlineURLs:	true
!	
URxvt.keysym.M-u:	perl:url-select:select_next

!disabled button 'new tab'
URxvt.tabbed.new-button:no
!?
URxvt.tabbed.tabbar-fg: 15
!?
URxvt.tabbed.tabbar-bg: 8
!?
URxvt.tabbed.tab-fg:    8
!?
URxvt.tabbed.tab-bg:    14

Rxvt.font: -misc-fixed-medium-r-normal--15-140-75-75-c-90-iso8859-1
URxvt.boldFont: -misc-fixed-bold-r-normal--15-140-75-75-c-90-iso8859-1
!disable scrollbar
URxvt*scrollBar:       	false	

В итоге получаем приятную для глаз цветовую схему нашего терминала.

В итоге получаем вот такую приятную и весьма удобную систему:


Конечно я не достиг такого уровня, как unlogic и мой конфиг ещё можно совершенствовать до бесконечности, но я получил удобную и работоспособную систему.

P.S. В emacs у меня цветовая схема monokai.
P.P.S. Надеюсь ничего не забыл описать.

Моё знакомство с WM Awesome. Часть 1 / Habr

Разговор пойдёт о моём первом знакомстве с таким оконным менеджером, как Awesome. Долгое время я использовал Gnome2, потом пробовал Gnome3, решил испробовать kde, но ничего из этого не удовлетворило меня. Да, к слову, у меня Gentoo. Да, статья ориентирована на таких же как и я новичков — дабы упростить жизнь.

В официальной ветке портажа стабильной является версия 3.4.15, но я решил поставить последнюю доступную — 3.5.2-r1, с USE флагом «dbus». В качество логин менеджера я выбрал SLiM. После сборки всех необходимых пакетов открываем /etc/conf.d/xdm и устанавливаем SLiM в качестве менеджера по умолчанию:

DISPLAYMANAGER="slim"

Далее необходимо сделать небольшие изменение я /etc/slim.conf

# login_cmd exec /bin/sh - ~/.xinitrc %session
login_cmd exec /bin/bash -login ~/.xinitrc %session
# login_cmd exec /bin/bash -login /usr/share/slim/Xsession %session

В этом конфиге также можете выбрать понравившуюся тему, которые лежат в /usr/share/slim/themes. Я обхожусь дефолтной. Так же там есть ещё пару интересных параметров, но я их не трогал — нет необходимости.

Терминал я решил использовать urxvt. У меня он собран:

rxvt USE="xgetdefaults"
rxvt-unicode USE="256-color focused-urgency font-styles mousewheel perl startup-notification vanilla xft"

Чтобы, собственно, запустился наш wm нужно вмести изменения в файл ~/.xinitrc (если его нету — то создать), ниже привожу свой:

urxvtd --quiet --opendisplay --fork &
pulseaudio --start &
exec ck-launch-session dbus-launch awesome

Первая строка — запускаю демон urxvt (в дальнейшем клиент вызывается urxvtc), ну, во второй понятно запускаем pulseaudio, и в последней запускаем сам awesome. Стоит отметить, что если у вас systemd, а не consolekit — то у вас вызов awesome вроде как отличается, но я не использую systemd, поэтому не берусь утверждать.

Запускаем xdm:
sudo /etc/init.d/xdm start

Логинимся и наблюдаем вот такую вот картину:

Я долго лазил по разным форумам в поисках красивых темок, конфигов, виджетов для awesome. Наткулся на такого пользователя unligic (у него много статей и интересных вещей на github)

И более новая версия его темы:

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

Конфигурационный файл лежит в /etc/xdg/awesome/rc.lua — но его я трогать не советую, просто скопируем его
cp /etc/xdg/awesome/rc.lua ~/.config/awesome/rc.lua
(У кого-то директории .config может не оказаться, не пугайтесь — просто создайте.
mkdir ~/.config
mkdir ~/.config/awesome

Начнём конфигурацию. (Да, я, пользуясь многими статьями, просто переписал его)

Тут мы перечисляем все подключаемые библиотеки
---------------------------------------------
--- Стандартные библиотеки ---
---------------------------------------------
local gears = require("gears")
local awful = require("awful")
local vicious = require("vicious")
awful.rules = require("awful.rules")
require("awful.autofocus")
local wibox = require("wibox")
local beautiful = require("beautiful")
local naughty = require("naughty")
local menubar = require("menubar")
local dbus = require("dbus")

Вроде всё понятно 🙂
---------------------------------------------------------
--- Устанавливаем системную локаль ---
---------------------------------------------------------
os.setlocale("ru_RU.UTF-8")

Эту часть оставляем без изменений — это обработчик ошибок
-- {{{ Error handling
-- Check if awesome encountered an error during startup and fell back to
-- another config (This code will only ever execute for the fallback config)
if awesome.startup_errors then
    naughty.notify({ preset = naughty.config.presets.critical,
                     title = "Oops, there were errors during startup!",
                     text = awesome.startup_errors })
end

-- Handle runtime errors after startup
do
    local in_error = false
    awesome.connect_signal("debug::error", function (err)
        -- Make sure we don't go into an endless error loop
        if in_error then return end
        in_error = true

        naughty.notify({ preset = naughty.config.presets.critical,
                         title = "Oops, an error happened!",
                         text = err })
        in_error = false
    end)
end
-- }}}

Я взял за основу тему zenburn (лежит в /usr/share/awesome/themes/zenburn). И решил её немного поменять под себя (практически не значительно, пока что)
-------------------------------------
--- Устанавливаем тему ---
-------------------------------------
beautiful.init("/home/worm2fed/.config/awesome/themes/worm2fed/theme.lua")

Параметр -nw в последней строчке позволяет запускать emacs в терминале
----------------------------------------------------------------------
--- Устанавливаем приложения по умолчанию ---
----------------------------------------------------------------------
terminal         = "urxvtc" -- Терминал по умолчанию
browser         = "google-chrome-stable" -- Браузер по умолчанию
editor              = os.getenv("EDITOR") or "emacs" -- Редактор по умолчанию
editor_cmd    = terminal .. " -nw" .. editor -- Команда запуска консольного редактора

Отступы ужасно съехали, но в редакторе оно всё красиво. Клавиша модификатор — её ещё называет супер, клавиша с логотипом шиндоуса. Чаще всего это Mod4, но может и отличаться. И далее коды кнопок мыши и нужных в конфиге клавиш. Для проверки кодов мыши:
xev | grep 'button'

Для клавиши модификатора и остальных клавиш:
xev | grep 'keycode'

Коды кнопок и клавиш
-----------------------------------------
--- Клавиша-модификатор ---
-----------------------------------------
modkey             = "Mod4"

---------------------------
--- Кнопки мыши ---
---------------------------
left_button                  = 1
wheel_button            = 2
right_button               = 3
plus_button               = 4 
minus_button           = 5
wheel_left_button    = 6
wheel_write_button = 7

-----------------------------------
--- Скан-коды клавиш ---
-----------------------------------
key_V              = "#55"
key_Z              = "#52"
key_Y               = "#29"
key_J                = "#44"
key_K               = "#45"
key_N               = "#57"
key_M               = "#58"
key_F                = "#41"
key_R               = "#27"
key_L                = "#46"
key_C               = "#54"
key_W               = "#25"
key_X                = "#53"
key_Q                = "#24"
key_H                = "#43"
key_Tab             = "#23"
key_Tilda           = "#49"
key_U                  = "#30"
key_E                  = "#26"
key_T                   = "#28"
key_P                   = "#33"
key_O                   = "#32"
key_Return          = "#36"
key_Left               = "#113"
key_Right            = "#114"
key_Esc               = "#9"
key_Print              = "#107"
key_Alt_R             = "#108"
key_Alt_L              = "#64"
key_Space           = "#65"
key_Ctrl_R           = "#105"
key_Ctrl_L            = "#37"
key_Home            = "#110"
key_F1                   = "#67"
key_Mute               = "#121"
key_Vol_Down     = "#122"
key_Vol_Up          = "#123"

Здесь я выбрал нужные мне разметки окон
------------------------------------------------------------------------------
--- Layouts - способы расположения окон на экране ---
-----------------------------------------------------------------------------
local layouts =
{
    awful.layout.suit.floating,          -- 1  
    awful.layout.suit.tile,                  -- 2 Главное окно слева, справа второстепенные (мелкие)
    --awful.layout.suit.tile.left,         -- * Слева второстепенные окна
    awful.layout.suit.tile.bottom,    -- 3 Внизу второстепенные окна
    --awful.layout.suit.tile.top,         -- * Второстепенные окна вверху
    awful.layout.suit.fair,                  -- 4
    --awful.layout.suit.fair.horizontal,
    --awful.layout.suit.spiral,
    awful.layout.suit.spiral.dwindle,    -- 5
    awful.layout.suit.max,                      -- 6
    --awful.layout.suit.max.fullscreen,
    awful.layout.suit.magnifier             -- 7
}

Тут всё ясно
--------------------------------------
--- Обои рабочего стола ---
--------------------------------------
-- Если в теме заданы обои
if beautiful.wallpaper then
  -- Перебираем все экраны
  for s = 1, screen.count() do
    -- На каждый экран кладем обои (можно в принципе на каждый экран свои)
    gears.wallpaper.maximized(beautiful.wallpaper, s, true)
  end
end

Имена тегов могут быть абсолютно любыми — я выбрал греческие буквы — как на скрине unlogic. Каждому отдельному тегу я присваиваю своё макет, которые мы определили выше.

Тэги
---------------------------------------------------------
--- Тэги - виртуальные рабочие столы ---
---------------------------------------------------------
-- Список тэгов
tags = {
   -- Имена тэгов
   names  = { "  α  ", "  β  ", "  ζ  ", "  Θ  ", "  Ξ  ", "  ς  ", "  ψ  "},
   -- Макеты тэгов
   layout = { layouts[1], layouts[2], layouts[3], layouts[4], layouts[5],
              layouts[6],  layouts[7]
}}
-- Перебираем все экраны
for s = 1, screen.count() do
   -- На каждом создаем список тэгов, устанавливая макет отображения окон
   tags[s] = awful.tag(tags.names, s, tags.layout)
end

Собираем менюшку (не знаю зачем она нужна, так ни разу и не использовал)
------------------------------
--- Главное меню ---
------------------------------
--- Интернет-приложения
internet_menu =
{
    -- Формат описания пункта меню
    -- {<Назавание пункта меню>, <Команда запуска>, <Иконка>}
    {" Firefox", "firefox-bin", beautiful.firefox_icon},
    {" Chrome", "google-chrome-stable", beautiful.chrome_icon},
    {" Pidgin", "pidgin"}
}
--- 
editors_menu =
{
  {" Eclipse", "eclipse-bin-4.2"},
  {" Emacs", "emacs"}
}
--- 
office_menu = {
  {" Word", "libreoffice --writer"},
  {" Exel", "libreoffice --calc"}
}

main_menu = awful.menu({
  -- Таблица пунктов главного меню
  items = {
      {" Интернет", internet_menu},
      {" Редакторы", editors_menu},
      {" LibreOffice", office_menu},
      {" "},
      {" Перезагрузка", "reboot", beautiful.reboot_icon},
      {" Выключение", "halt", beautiful.poweroff_icon},
      {" Выход", awesome.quit, beautiful.logout_icon}
  }
})

------------------------------------------------------------------
--- Лаунчер - та кнопка что на панели слева --- 
------------------------------------------------------------------
launcher = awful.widget.launcher({ image = beautiful.gentoo_icon, menu = main_menu })

А вот это так и не понял для чего
-- Menubar configuration
menubar.utils.terminal = terminal -- Set the terminal for applications that require it
-- }}}

Статья вышла очень большой, поэтому пришлось разбить на части, продолжение тут

Про awesome: настройка и использование

В общем, я посмотрел на DWM, мне стало печально (ну не дело «настраивать» любое ПО через правки исходных кодов… не дело), стал смотреть в сторону альтернатив. Нашел awesome. Это вроде как  тот же DWM, только более гибкий и настраиваемый. Правда, не без странностей: конфиги его написаны на малораспространенном языке программирования lua. Зато — их великое множество. Хорошая документация, и (о чудо после dwm’a) — для конфигурирования не надо лезть в исходный код и перекомпилировать приложение!

Ну, что же… проверим.

Ставим awesone:

alexander@alexander-VPCP11S1R:~$ sudo apt-get intall awesome awesome-extra

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

Создаем папку настроек:

alexander@alexander-VPCP11S1R:~$ mkdir ~/.config/awesome
alexander@alexander-VPCP11S1R:~$ ls ~/.config/ | grep awesome
awesome

Копируем в нее файл автостарта openbox (он уже есть — чего по новой-то городить?)

alexander@alexander-VPCP11S1R:~$ cp ~/.config/openbox/autostart ~/.config/awesome/autostart

Смотрим, что в нем:

alexander@alexander-VPCP11S1R:~$ cat ~/.config/awesome/autostart
/home/alexander/My-Scripts/xrandr.sh
if which tint2 >/dev/null 2>&1; then
  (sleep 1 && xcompmgr) &
  (sleep 2 && tint2) &
  (sleep 5 && xxkb) &
  (sleep 5 && volumeicon ) &
fi
pcmanfm --desktop &
(sleep 2 && setxkbmap -layout "us,ru" -option "grp:alt_shift_toggle") &

Малость редактируем:

alexander@alexander-VPCP11S1R:~$ gedit ~/.config/awesome/autostart

Привоим к виду:

/home/alexander/My-Scripts/xrandr.sh
xxkb
setxkbmap -layout "us,ru" -option "grp:alt_shift_toggle"
volumeicon

Смотрим, что у нас в xrandr.sh (это только для sony vaio):

alexander@alexander-VPCP11S1R:~$ cat ~/My-Scripts/xrandr.sh 
#!/bin/bash
xrandr --newmode "1280x600_60.00"   61.00  1280 1328 1456 1632  600 603 613 624 -hsync +vsync
xrandr --newmode "1600x768_60.00"  100.25  1600 1688 1848 2096  768 771 781 798 -hsync +vsync
xrandr --addmode LVDS-0 1280x600_60.00
xrandr --addmode LVDS-0 1600x768_60.00
xrandr --output LVDS-0 --mode 1280x600_60.00

Во всех руководствах по awesome пишут, что работать надо с локальным конфигом, так что делаем его:

alexander@alexander-VPCP11S1R:~$ cp /etc/xdg/awesome/rc.lua ~/.config/awesome/rc.lua

Теперь можно приступать непосрественно к автостарту

В начало rc.lua вписываем:

-------------------------------------------------------------------------------
--    Формируем список автозапуска
-------------------------------------------------------------------------------
local autostart_list = {}
-- Открываем файл списка для чтения
local f = io.open("/home/alexander/.config/awesome/autostart", "r")
-- Число прочитанных команд
local num_cmd = 0
-- Читаем команды в список и считаем их
for line in f:lines() do
  autostart_list[num_cmd] = line
  num_cmd = num_cmd + 1
end
-------------------------------------------------------------------------------
-- Конец списка автозапуска
-------------------------------------------------------------------------------

И в конец rc.lua

------------------------------------------------------------------------------
--    Автозапуск (этот код ставим в конце rc.lua)
------------------------------------------------------------------------------
-- Перебираем список автозапуска и стратуем всё с паузой в три секунды
for i = 0, num_cmd - 1 do
  awful.util.spawn_with_shell(autostart_list[i] .. " && sleep 3")
end
------------------------------------------------------------------------------
--    Конец: Автозапуск (этот код ставим в конце rc.lua)
------------------------------------------------------------------------------

(решение отсюда: http://archlinux.org.ru/forum/topic/11748/?page=4)

Вообще много способов описано тут: https://awesome.naquadah.org/wiki/Autostart/ru — я взял самый удобный мне, чтобы все приложения автозапуска были бы в отдельном файле.

Раз уж мы работаем с rc.lua, то заодно и обои поправим.

Копируем к себе файл темы:

alexander@alexander-VPCP11S1R:~$ cp /usr/share/awesome/themes/default/theme.lua ~/.config/awesome/theme.lua

Открываем его

Ищем строку

theme.wallpaper_cmd = { «awsetbg /usr/share/awesome/themes/default/background.png» }

Закомментируем ее:

—theme.wallpaper_cmd = { «awsetbg /usr/share/awesome/themes/default/background.png» }

И вместо нее пишем:

theme.wallpaper_cmd = { «awsetbg /home/alexander/Изображения/Wallpapers/1372644-wp-1253020795739.jpg» }

Затем в rc.lua нахоим и меняем строчку темы:

beautiful.init(«/usr/share/awesome/themes/default/theme.lua»)

на

beautiful.init(«/home/alexander/.config/awesome/theme.lua»)

Еще немного украшательств: календарь при наведении на часы

В ~/.config/awesome кладем calendar2.lua со следующим содержанием:

    -- original code made by Bzed and published on <a href="http://awesome.naquadah.org/wiki/Calendar_widget" target="_blank" >http://awesome.naquadah.org/wiki/Calendar_widget</a>
    -- modified by Marc Dequènes (Duck) <[email protected]> (2009-12-29), under the same licence,
    -- and with the following changes:
    --   + transformed to module
    --   + the current day formating is customizable
     
    local string = string
    --local print = print
    local tostring = tostring
    local os = os
    local capi = {
        mouse = mouse,
        screen = screen
    }
    local awful = require("awful")
    local naughty = require("naughty")
    module("calendar2")
     
    local calendar = {}
    local current_day_format = "<u>%s</u>"
     
    function displayMonth(month,year,weekStart)
            local t,wkSt=os.time{year=year, month=month+1, day=0},weekStart or 1
            local d=os.date("*t",t)
            local mthDays,stDay=d.day,(d.wday-d.day-wkSt+1)%7
     
            --print(mthDays .."\n" .. stDay)
            local lines = "  " --интервал перед днями неделями
            os.setlocale("ru_RU.utf8")
            for x=0,6 do
                    lines = lines .. os.date("%a ",os.time{year=2006,month=1,day=x+wkSt})
            end
           lines = lines .. "\n"-- .. os.date(" %V",os.time{year=year,month=month,day=1}) --Убираем номер недели
     
            local writeLine = 1
            while writeLine < (stDay + 1) do
                    lines = lines .. "    " --интервал перед первым числом, если оно не в начале недели
                    writeLine = writeLine + 1
            end
     
            for d=1,mthDays do
                    local x = d
                    local t = os.time{year=year,month=month,day=d}
                    if writeLine == 8 then
                            writeLine = 1
                            lines = lines .. "\n"-- .. os.date(" %V",t) --убираем номер недели
                    end
                    if os.date("%Y-%m-%d") == os.date("%Y-%m-%d", t) then
                            x = string.format(current_day_format, d)
                    end
                    if (#(tostring(d)) == 1) then
                            x = " " .. x --выравнивание между одно и двухзначными цифрами
                    end
                    lines = lines .. "  " .. x --интервал между числами
                    writeLine = writeLine + 1
            end
            local header = os.date("%B %Y\n",os.time{year=year,month=month,day=1})
            header = "          " .. header --выравниваем месяц и год по центру
            return header .. "\n" .. lines
    end
     
    function switchNaughtyMonth(switchMonths)
            if (#calendar < 3) then return end
            local swMonths = switchMonths or 1
            calendar[1] = calendar[1] + swMonths
            calendar[3].box.widgets[2].text = string.format('<span font_desc="%s">%s</span>', "monospace", displayMonth(calendar[1], calendar[2], 2))
    end
     
    function switchNaughtyGoToToday()
            if (#calendar < 3) then return end
            local swMonths = switchMonths or 1
            calendar[1] = os.date("*t").month
            calendar[2] = os.date("*t").year
           switchNaughtyMonth(0)
    end
     
    function addCalendarToWidget(mywidget, custom_current_day_format)
      if custom_current_day_format then current_day_format = custom_current_day_format end
     
      mywidget:add_signal('mouse::enter', function ()
            local month, year = os.date('%m'), os.date('%Y')
            calendar = { month, year,
            naughty.notify({
                    text = string.format('<span font_desc="%s">%s</span>', "monospace", displayMonth(month, year, 2)),
                    timeout = 0,
                    hover_timeout = 0.5,
                    screen = capi.mouse.screen
            })
      }
      end)
      mywidget:add_signal('mouse::leave', function () naughty.destroy(calendar[3]) end)
     
      mywidget:buttons(awful.util.table.join(
        awful.button({ }, 1, function()
            switchNaughtyMonth(-1)
        end),
        awful.button({ }, 2, switchNaughtyGoToToday),
        awful.button({ }, 3, function()
            switchNaughtyMonth(1)
        end),
        awful.button({ }, 4, function()
            switchNaughtyMonth(-1)
        end),
        awful.button({ }, 5, function()
            switchNaughtyMonth(1)
        end),
        awful.button({ 'Shift' }, 1, function()
            switchNaughtyMonth(-12)
        end),
        awful.button({ 'Shift' }, 3, function()
            switchNaughtyMonth(12)
        end),
        awful.button({ 'Shift' }, 4, function()
            switchNaughtyMonth(-12)
        end),
        awful.button({ 'Shift' }, 5, function()
            switchNaughtyMonth(12)
        end)
      ))
    end

Далее, в верх rc.lua добавляем

require(«calendar2»)

И после строки

mytextclock = awful.widget.textclock({ align = «right» })

вставялем

calendar2.addCalendarToWidget(mytextclock, «<span color=’green’>%s</span>»)

проверяем, всё работает!

Проблема: некоторые процессы запускаются по несколько раз.

Нашел функцию (http://www.linux.org.ru/forum/general/8424382)

-- {{{ Autoruns
function run_once(prg)
    if not prg then
        do return nil end
    end
    awful.util.spawn_with_shell('ps ux | grep -v grep | grep -F ' .. prg .. ' || ' .. prg .. ' &')
end

Еще одна очень интересная возможность awesome — теги.

Во-первых, их можно переименовать «под себя». Достаточно найти tags { names — и там исправить имена тегов.

Например:

 tags[s] = awful.tag({ «Main», «WWW», «IM», «Ed», «CMD», 6, 7, 8, 9 }, s, layouts[1])

Во-вторых, можно запускать приложения в тегах, для этого надо внести корректировки в секцию awful.rules.rules.

Например, чтобы firefox запускался во втором теге, надо написать:

  { rule = { class = «Firefox» },  properties = {tag = tags[1][2]}},

Как идея: если совместить эту особенность с автозагрузкой, то можно сразу после загрузки получить готовую к употреблению рабочую среду.

теперь очень важная на sony vaio функция: переключение разрешения. Для этого ищем globalkeys, и вносим туда:

awful.key({}, «#146», function () awful.util.spawn(«~/My-Scripts/xrandr-change.sh») end)

проверяем. Работает!

Продолжение видимо следует…)))

Еще записи по теме

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *