Классный оконный менеджер — 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 идеально подойдет людям, которые часто держат в фокусе несколько окон. Так же он подойдет для слабых машин и легковесных систем, и машин с небольшими экранами (ноутбуки)
Заучив (по началу), а потом по наитию нажимая хоткеи, Вы уже не будете думать над тем, как, куда, что сделать с окном, как его разместить.
Но что слова! Скриншоты!
Полноразмерный последний скриншот
Мои обои, по просьбам трудящихся.
А так же видео, демонстрирующее работу WM.
Так же прилагаю архив со своим конфигом + плагины.
Надеюсь, я заинтересовал Вас этим классным (от англ. awesome) WM, и Вы попробуете его в деле! И готов с радостью ответить и помочь в комментариях.
UPD. Всех, кто хочет поделится своей конфигурацией или посмотреть чужие, ждут на соответствующей странице вики.
awesome (Русский) — ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Awesome. Дата последней синхронизации: 17 марта 2016. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

С официального сайта:
«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 (опять таки, если его нету — смело создаём)
!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)
проверяем. Работает!
Продолжение видимо следует…)))