Pull to refresh

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

Reading time 7 min
Views 30K
Разговор пойдёт о моём первом знакомстве с таким оконным менеджером, как 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
-- }}}



Статья вышла очень большой, поэтому пришлось разбить на части, продолжение тут
Tags:
Hubs:
+3
Comments 13
Comments Comments 13

Articles