FastLinux modifikace awesome wm 3.4.1
Upravená konfigurace tohoto výborného window manageru.
Stručný popis změn oproti defaultnímu konfiguračnímu souboru awesome wm (rc.lua) a další informace.
Syntaxe konfiguračních souborů se oproti starším verzím trochu změnila a přidal jsem několik vylepšení, proto jsem se rozhodl napsat tento článek a neupravovat starší verzi. .
Původní článek doporučuji projít též - awesome 3.3
Screenshoty (IBM R61, rozlišení 1680*1050, Gentoo Linux):
Awesome 3.4.1 - Upravené konfigurační soubory a nové téma ke stažení.
Konfigurace je rozdělena do více souborů oproti defaultní verzi.
ls ~/.config/awesome/
autostart.sh - pro automatické spouštění aplikací awesome.lua - konfigurace awesome help.txt - popis nových klávesových zkratek (zobrazí se na ploše pomocí Mod4 + F1) menu_conf.lua - konfigurace menu rc.lua - slouží k nahrání defaultního konfigu při chybě uživatelova konfigu (zabrání zamrznutí awesome) scripts - adresář pomocných skriptů themes - adresář s tématem a ikonama vicious - adresář s knihovnou pro widgety
Konfigurace (awesome.lua).
Tady postupně ukážu pouze změny oproti defaultnímu konfiguráku rc.lua, i když jsou dobře okomentované v kódu.
Načtení knihovny s widgety.
-- widget library require("vicious")
Přidána proměnná pro pozdější použití v menu a theme.
-- {{{ Variable definitions -- path to home directory (cesta k domovskemu adresari uzivatele) homepath = os.getenv("HOME")
Změněna cesta k tématu vzhledu. Téma je předěláno a na nastavení pozadí plochy je v něm použit program nitrogen, jestli ho nepoužíváte upravte soubor s tématem.
-- Themes define colours, icons, and wallpapers -- beautiful.init("/usr/share/awesome/themes/default/theme.lua") beautiful.init(homepath .. "/.config/awesome/themes/mseed/theme.lua")
Upraven defaultní terminál a editor. Vzhled xtermu je zadán ručně pomocí parametrů. Tyto proměnné se použijí dále...
-- This is used later as the default terminal and editor to run. terminal = "xterm -bg black -fg white -fa terminus -fs 9" editor = "geany" or os.getenv("EDITOR") editor_cmd = terminal .. " -e " .. editor
Z layouts odebrán fullscreen mode. Na fullscreen používám klávesové zkratky Mod4 + f a Mod4 + m
-- Table of layouts to cover with awful.layout.inc, order matters. layouts = { awful.layout.suit.tile, awful.layout.suit.tile.left, awful.layout.suit.tile.bottom, awful.layout.suit.tile.top, awful.layout.suit.fair, awful.layout.suit.fair.horizontal, awful.layout.suit.spiral, awful.layout.suit.spiral.dwindle, awful.layout.suit.max, -- awful.layout.suit.max.fullscreen, awful.layout.suit.magnifier, awful.layout.suit.floating } -- }}}
Změna logiky a pojmenování tagů. Můžete modifikovat podle vašich potřeb.
-- {{{ Tags tags = {} tags.settings = { { name = "term", layout = layouts[1] }, { name = "work1", layout = layouts[1] }, { name = "work2", layout = layouts[1] }, { name = "web", layout = layouts[1] }, { name = "mail/im", layout = layouts[1], mwfact = 0.30 }, { name = "grafx", layout = layouts[11] }, { name = "media", layout = layouts[1] }, { name = "office", layout = layouts[11] }, { name = "temp", layout = layouts[11] } } for s = 1, screen.count() do tags[s] = {} for i, v in ipairs(tags.settings) do tags[s][i] = tag({ name = v.name }) tags[s][i].screen = s awful.tag.setproperty(tags[s][i], "layout", v.layout) awful.tag.setproperty(tags[s][i], "mwfact", v.mwfact) awful.tag.setproperty(tags[s][i], "hide", v.hide) end tags[s][1].selected = true end -- }}}
Oddělení definice menu do samostatného souboru pro lepší přehlednost .
-- {{{ Load menu - vlozi externi soubor s menu -- Create a laucher widget and a main menu require("menu_conf") -- }}}
Potřeboval jsem mít možnost vypisovat různé informace pomocí popup oken na ploše. Napsal jsem malinkou funkci která to zařídí. Použití je definováno níž pomocí klávesových zkratek.
-- {{{ -- Function that show command output on screen -- Funkce pro vypsani vystupu prikazu na obrazovku local function notify_cmd(title, cmd, spawn) -- Get data from command local out = awful.util.pread(cmd) -- Escape output out = awful.util.escape(out) naughty.notify{text = title .. "\n" .. out, timeout = spawn} end -- }}}
Přidány proměnné pro oddělovače použité v liště (wiboxu).
-- {{{ Reusable separators spacer = widget({ type = "textbox", name = "spacer" }) separator = widget({ type = "textbox", name = "separator" }) spacer.text = " " separator.text = "|" -- }}}
Přidána funkce pro zobrazení widgetu na ovládání hlasitosti zvuku. Je použita knihovna vicious. Tuto funkci můžete upravit podle vašich potřeb (Kanál PCM/MASTER, příkazy pro ovládání zvuku "amixer -q sset PCM 2dB+", ...)
Tato funkce může způsobovat problémy, jestliže je špatně nastavena.
Při problémech s nastartováním awesome ji můžete smazat, ale nezapomenout smazat i spouštění této funkce, které je definováno níže v konfiguračním souboru. Je to řádek 234, stačí zakomentovat.
-- {{{ Volume level widget -- Widget icon -- volicon = widget({ type = "imagebox", name = "volicon" }) -- volicon.image = image(beautiful.widget_vol) -- Initialize widgets volwidget = widget({ type = "textbox", name = "volwidget" }) volbarwidget = awful.widget.progressbar({ layout = awful.widget.layout.horizontal.rightleft }) -- Progressbar properties volbarwidget:set_width(8) volbarwidget:set_height(18) volbarwidget:set_vertical(true) volbarwidget:set_background_color(beautiful.fg_off_widget) volbarwidget:set_border_color(nil) volbarwidget:set_color(beautiful.fg_widget) volbarwidget:set_gradient_colors({ beautiful.fg_widget, beautiful.fg_center_widget, beautiful.fg_end_widget }) awful.widget.layout.margins[volbarwidget.widget] = { top = 2, bottom = 2 } -- Register widgets vicious.enable_caching(vicious.widgets.volume) vicious.register(volwidget, vicious.widgets.volume, "$1%", 2, "PCM") vicious.register(volbarwidget, vicious.widgets.volume, "$1", 2, "PCM") -- Register buttons volbarwidget.widget:buttons(awful.util.table.join( awful.button({ }, 1, function () awful.util.spawn(terminal .. " -e alsamixer", false) end), awful.button({ }, 2, function () awful.util.spawn("amixer -q sset Master toggle", false) end), awful.button({ }, 4, function () awful.util.spawn("amixer -q sset PCM 2dB+", false) end), awful.button({ }, 5, function () awful.util.spawn("amixer -q sset PCM 2dB-", false) end) )) volwidget:buttons( volbarwidget.widget:buttons() ) -- }}}
Přidána funkce pro zobrazení widgetu baterie. Je použita knihovna vicious.
Spouštění této funkce je definováno na řádku 235. V případě problémů zakomentovat nebo smazat.
-- {{{ Battery state -- Widget icon -- baticon = widget({ type = "imagebox", name = "baticon" }) -- baticon.image = image(beautiful.widget_bat) -- Initialize widget batwidget = widget({ type = "textbox", name = "batwidget" }) -- Register widget vicious.register(batwidget, vicious.widgets.bat, "$1$2%", 61, "BAT0") -- }}}
Upravil jsem formát zobrazování času a data na liště.
-- Create a textclock widget - (datum a cas) mytextclock = awful.widget.textclock({ align = "right" }, "%d.%m.%Y %H:%M" )
Upravena velikost, rozložení a obsah lišty.
Je zde i spouštění widgetů hlasitosti a baterie.
-- Create the wibox mywibox[s] = awful.wibox({ position = "top", screen = s, height = "25" }) -- Add widgets to the wibox - order matters mywibox[s].widgets = { { mylauncher, mytaglist[s], mypromptbox[s], mylayoutbox[s], layout = awful.widget.layout.horizontal.leftright }, spacer, s == 1 and mysystray or nil, separator, mytextclock,spacer,separator, spacer,volwidget, spacer, volbarwidget.widget, separator, spacer, batwidget, separator, mytasklist[s], layout = awful.widget.layout.horizontal.rightleft }
Základní klávesové zkratky jsou zachované, ale přidal jsem mnoho dalších.
Klávesové zkratky volají mnoho externích programů, proto je dobré si je upravit podle svých potřeb.
-- terminal awful.key({ "Mod1" }, "F1", function () awful.util.spawn(terminal) end), -- gmrun awful.key({ "Mod1" }, "F2", function () awful.util.spawn("gmrun") end), -- dmenu awful.key({ "Mod1" }, "F3", function () awful.util.spawn(homepath .. "/.config/awesome/scripts/dmenu.sh") end), -- vypnuti aplikace awful.key({ "Mod1" }, "F4", function () if client.focus then client.focus:kill() end end), -- Web search awful.key({ "Mod1" }, "F5", function () awful.prompt.run({ prompt = "Web search: " }, mypromptbox[mouse.screen].widget, function (command) awful.util.spawn("firefox 'http://www.google.cz/search?q="..command.."'", false) if tags[mouse.screen][4] then awful.tag.viewonly(tags[mouse.screen][4]) end end) end), -- SSH connect awful.key({ "Mod1" }, "F6", function () awful.prompt.run({ prompt = "SSH Connect: " }, mypromptbox[mouse.screen].widget, function (host) awful.util.spawn(terminal .. " -e ssh " .. host, false) end) end), -- Rdesktop connect awful.key({ "Mod1" }, "F7", function () awful.prompt.run({ prompt = "Remote: " }, mypromptbox[mouse.screen].widget, function (host) awful.util.spawn(terminal .. " -e rdesktop -g 1024*762 -k cs_cz -u" .. host, false) end) end), -- OpenVPN connect -- awful.key({ "Mod1" }, "F8", function () awful.util.spawn(homepath .. "/.config/awesome/scripts/openvpn_start.sh") end), awful.key({ "Mod1" }, "F8", function () awful.util.spawn(terminal .. "-hold -e '" .. homepath .. "/.config/awesome/scripts/openvpn_start.sh'") end), -- screenshot awful.key({ modkey }, "Print", function () awful.util.spawn("scrot 'shot_%d.%m.%Y_%H.%M.%S.png' -e 'mv $f ~/shots/ & mirage ~/shots/$f'") end), -- hlasitost awful.key({ modkey }, "#115", function () awful.util.spawn(homepath .. "/.config/awesome/scripts/pvol.py -m", false) end), awful.key({ modkey }, "#117", function () awful.util.spawn(homepath .. "/.config/awesome/scripts/pvol.py -p -c -5", false) end), awful.key({ modkey }, "#112", function () awful.util.spawn(homepath .. "/.config/awesome/scripts/pvol.py -p -c 5", false) end), -- hlasitost - multimedialni tlacitka (thinkpad r61) awful.key({ } , "#122", function () awful.util.spawn("amixer -q set Master 2- unmute") end), awful.key({ } , "#123", function () awful.util.spawn("amixer -q set Master 2+ unmute") end), awful.key({ modkey }, "#122", function () awful.util.spawn("amixer -q set PCM 2- unmute") end), awful.key({ modkey }, "#123", function () awful.util.spawn("amixer -q set PCM 2+ unmute") end), -- zamknuti pc (lock) awful.key({ modkey }, "e", function () awful.util.spawn("xscreensaver-command -lock") end), -- plovouci okno na vsechny plochy awful.key({ modkey }, "s", function () client.focus.sticky = not client.focus.sticky end), -- plovouci okno vzdy navrchu awful.key({ modkey }, "a", function () client.focus.ontop = not client.focus.ontop end), -- schova okno awful.key({ modkey }, "d", function () client.focus.hide = not client.focus.hide end), -- Notifikace - HELP awful.key({ modkey }, "F1", function () notify_cmd("Přidané klávesové zkratky: \n", "cat " .. homepath .. "/.config/awesome/help.txt", 20) end), -- Notifikace - main info awful.key({ modkey }, "F2", function () notify_cmd("Volné místo", "df -hT", 10) end), -- Notifikace - logs awful.key({ modkey }, "F3", function () notify_cmd("dmesg", "dmesg | tail -n 30", 10) -- notify_cmd("/var/log/Xorg.0.log", "cat /var/log/Xorg.0.log | tail", 5) end), -- Notifikace - net info awful.key({ modkey }, "F4", function () notify_cmd("Netstat ", "netstat -nat", 0) end), -- Notifikace - proc awful.key({ modkey }, "F5", function () notify_cmd("Procesy", "ps -u | tail -n 30", 10) end), -- vertikalni a horzontalni resaiz oken awful.key({ modkey, "Mod1" }, "Down", function () awful.client.incwfact(0.05) end), awful.key({ modkey, "Mod1" }, "Up", function () awful.client.incwfact(-0.05) end), awful.key({ modkey, "Mod1" }, "Right", function () awful.tag.incmwfact( 0.05) end), awful.key({ modkey, "Mod1" }, "Left", function () awful.tag.incmwfact(-0.05) end), -- Zobrazí / schová titlebar (20px vysoky). awful.key({ modkey }, "q", function () if client.focus.titlebar then awful.titlebar.remove(client.focus, { modkey = modkey, height = "20" }) else awful.titlebar.add(client.focus, { modkey = modkey, height = "20" }) end end)
Přidána pravidla pro spouštění definovaných aplikací (umístění na plochu, layout)
-- {{{ Rules -- pravidla pro ruzne aplikace (v jakem tagu a na jakem screenu) awful.rules.rules = { -- All clients will match this rule. { rule = { }, properties = { border_width = beautiful.border_width, border_color = beautiful.border_normal, focus = true, keys = clientkeys, buttons = clientbuttons } }, { rule = { class = "pinentry" }, properties = { floating = true } }, { rule = { class = "gimp" }, properties = { floating = true, tag = tags[1][6] } }, { rule = { class = "Firefox" }, properties = { tag = tags[1][4] } }, { rule = { class = "Liferea" }, properties = { tag = tags[1][4] } }, { rule = { class = "Claws-mail" }, properties = { tag = tags[1][5] } }, { rule = { class = "Xchat" }, properties = { tag = tags[1][5] } }, { rule = { class = "soffice" }, properties = { tag = tags[1][8] } }, { rule = { class = "Inkscape" }, properties = { tag = tags[1][6] } }, { rule = { class = "Blender" }, properties = { tag = tags[1][6] } }, { rule = { class = "Gajim.py" }, properties = { tag = tags[1][5] } }, } -- }}}
Nastavení titlebaru oken. Nastavil jsem výšku, ale momentálně nepoužívám, proto jsem nechal zakomentováno.
Pro zobrazování titlebarů oken můžete odkomentovat jako v tomto příkladu. Vzhled panelu (ikony, ..) je definován v souboru s tématem vzhledu.
-- Add a titlebar (zapne titlebar a nastavi mu vysku - height = "25") awful.titlebar.add(c, { modkey = modkey , height = "24"})
Zakomentoval jsem funkci pro udělění fokusu okna po najetí myší. Radši mám klasické kliknutí nebo klávesovou zkratku.
-- Enable sloppy focus (fokus pri najeti mysi - bez nutnosti kliknout) --c:add_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)
Menu (menu_conf.lua).
Menu je oproti defaultímu odděleno do samostatného souboru menu_conf.lua a rozsáhle rozšířeno. Individuální úprava je nutností, každý používá jiné programy.