В общем, я посмотрел на 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) <Duck@DuckCorp.org> (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)
проверяем. Работает!
Продолжение видимо следует...)))