-- vim: ts=4 sw=4 expandtab -- Standard awesome library require("awful") -- Theme handling library require("beautiful") -- Notification library require("naughty") -- ACPI require("sysctl") package.path = awful.util.getdir("config") .. '/lib/?.lua;' .. package.path -- {{{ Variable definitions -- Themes define colours, icons, and wallpapers -- The default is a dark theme -- theme_path = "/usr/local/share/awesome/themes/default/theme.lua" -- theme_path = "/home/garga/my_stuffs/awesome/themes/garga/theme.lua" -- theme_path = awful.util.getdir("config") .. "/themes/garga" -- Uncommment this for a lighter theme -- theme_path = "/usr/local/share/awesome/themes/sky/theme" -- Actually load theme beautiful.init(theme_path) -- This is used later as the default terminal and editor to run. terminal = "xterm" editor = os.getenv("EDITOR") or "vi" editor_cmd = terminal .. " -e " .. editor -- Default modkey. -- Usually, Mod4 is the key with a logo between Control and Alt. -- If you do not like this or do not have such a key, -- I suggest you to remap Mod4 to another key using xmodmap or other tools. -- However, you can use another modifier like Mod1, but it may interact with others. modkey = "Mod4" -- 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.max, awful.layout.suit.max.fullscreen, awful.layout.suit.magnifier, awful.layout.suit.floating } -- Table of clients that should be set floating. The index may be either -- the application class or instance. The instance is useful when running -- a console app in a terminal like (Music on Console) -- xterm -name mocp -e mocp floatapps = { -- by class ["MPlayer"] = true, ["pinentry"] = true, ["gimp"] = true, ["pidgin"] = true, ["gmrun"] = true, ["display"] = true, ["ROX-Filer"] = true, ["Audacious"] = true, ["fxterm"] = true, -- ["Firefox"] = true, -- ["claws-mail"] = true, -- by instance ["mocp"] = true } -- Table of clients that should be set sticky. The index may be either -- the application class or instance. The instance is useful when running -- a console app in a terminal like (Music on Console) -- xterm -name mocp -e mocp stickyapps = { -- by class ["pidgin"] = true -- by instance } nocenterapps = { ["pidgin"] = true } audacious = { ["Audacious"] = true } -- Applications to be moved to a pre-defined tag by class or instance. -- Use the screen and tags indices. apptags = { ["Mutt"] = { screen = 1, tag = 1 }, ["irssi"] = { screen = 1, tag = 2 }, ["Firefox"] = { screen = 1, tag = 3 }, ["claws-mail"] = { screen = 1, tag = 3 } } -- Define if we want to use titlebar on all applications. use_titlebar = false -- }}} -- {{{ Tags -- Define tags table. tags = {} for s = 1, screen.count() do -- Each screen has its own tag table. tags[s] = {} -- Create 9 tags per screen. for tagnumber = 1, 9 do tags[s][tagnumber] = tag(tagnumber) -- Add tags to screen one by one tags[s][tagnumber].screen = s if tagnumber == 3 then awful.layout.set(layouts[10], tags[s][tagnumber]) elseif tagnumber <= 2 then awful.layout.set(layouts[4], tags[s][tagnumber]) else awful.layout.set(layouts[1], tags[s][tagnumber]) end end -- I'm sure you want to see at least one tag. tags[s][4].selected = true end -- }}} -- {{{ Widgets -- Set background color function bg(color, text) return '' .. text end -- Set foreground color function fg(color, text) return '' .. text .. '' end -- Boldify text function bold(text) return '' .. text .. '' end -- Widget base -- [content] function widget_base(content) if content and content ~= "" then return bold(fg(beautiful.hilight, " [ ")) .. content .. bold(fg(beautiful.hilight, " ] ")) end end -- Widget section -- label: content (| next_section)? function widget_section(label, content, next_section) local section if content and content ~= nil then if label and label ~= "" then section = bold(label .. ": ") .. content else section = content end if next_section and next_section ~= "" then section = section .. bold(fg(beautiful.hilight, " | ")) .. next_section end else section = next_section end return section end -- Widget value -- content (/ next_value)? function widget_value(content, next_value) local value if content and content ~= nil then value = content if next_value and next_value ~= "" then value = value .. bold(fg(beautiful.hilight, " / ")) .. next_value end else value = next_value end return value end -- Volume function function widget_volume() local f = io.popen("mixer -S vol | cut -d: -f2") local l = f:read() f:close() return widget_base(bold("Vol ") .. l) end -- Just a clock, %d/%m/%Y %H:%M:%S function widget_clock() return widget_base(os.date("%d/%m/%Y " .. bold("%H:%M:%S"))) end -- naughty calendar calendar = nil cal_offset = 0 function remove_calendar() if calendar ~= nil then naughty.destroy(calendar) calendar = nil cal_offset = 0 end end function add_calendar(inc_offset) local save_offset = cal_offset remove_calendar() cal_offset = save_offset + inc_offset local datespec = os.date("*t") datespec = datespec.year * 12 + datespec.month - 1 + cal_offset datespec = (datespec % 12 + 1) .. " " .. math.floor(datespec / 12) local cal = awful.util.pread("cal " .. datespec) if cal_offset == 0 then -- this month, hilight day and month cal = string.gsub(cal, "%s" .. tonumber(os.date("%d")) .. "%s", bold(fg(beautiful.hilight, "%1"))) cal = string.gsub(cal, "^(%s*%w+%s+%d+)", bold(fg(beautiful.hilight, "%1"))) end calendar = naughty.notify { text = string.format('%s', "monospace", cal), timeout = 0, hover_timeout = 0.5, width = 180, height = 400, } end -- Get and format ACPI informations -- (FreeBSD version, need the lfbsdacpi.so library) function widget_acpi() local function notify(text) if use_naughty then local width = 155 if string.match(text, "AC") then width = 110 end naughty.notify { title = "ACPI infos", text = bold(text), fg = beautiful.bg_normal, bg = beautiful.hilight, width = width } end end local lifemsg, life, temp, time life = sysctl.get("hw.acpi.battery.life") temp = sysctl.IK2celsius(sysctl.get("hw.acpi.thermal.tz0.temperature")) if sysctl.get("hw.acpi.acline") == 1 then time = "Infinity" if life == 100 then lifemsg = "Full" else lifemsg = "Charging" end else time = sysctl.get("hw.acpi.battery.time") .. "m" lifemsg = "Discharging" if life <= 5 then lifemsg = bold(lifemsg) -- blink if (os.time() % 2 == 0) then lifemsg = fg(battery_low, lifemsg) end end end return widget_base(widget_section("battery", widget_value(life .. "%", lifemsg), widget_section("left", time, widget_section(nil, temp .. "C")))) end -- }}} -- {{{ Personal function myquit() os.execute("pkill -f audacious") awesome.quit() end -- }}} -- {{{ Wibox -- Create a textbox widget -- mytextbox = widget({ type = "textbox", align = "right" }) -- Set the default text in textbox -- mytextbox.text = " " .. AWESOME_RELEASE .. " " -- Create a clockbox widget clockbox = widget { type = "textbox", align = "right" } -- Set the default text in textbox clockbox.text = " " .. awesome.release .. " " clockbox.mouse_enter = function() add_calendar(0) end clockbox.mouse_leave = remove_calendar clockbox:buttons { button({ }, 1, function() add_calendar(-1) end), button({ }, 3, function() add_calendar(1) end), } -- Create a volume widget volumebox = widget { type = "textbox", align = "right" } -- Create ACPI widget acpibox = widget { type = "textbox", align = "right" } -- Create a laucher widget and a main menu myawesomemenu = { { "manual", terminal .. " -e man awesome" }, { "edit config", editor_cmd .. " " .. awful.util.getdir("config") .. "/rc.lua" }, { "restart", awesome.restart }, { "quit", myquit } } mymainmenu = awful.menu.new({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, { "open terminal", terminal } } }) mylauncher = awful.widget.launcher({ image = image(beautiful.awesome_icon), menu = mymainmenu }) -- Create a systray mysystray = widget({ type = "systray", align = "right" }) -- Create a wibox for each screen and add it mywibox = {} mypromptbox = {} mylayoutbox = {} mytaglist = {} mytaglist.buttons = awful.util.table.join ( awful.button({ }, 1, awful.tag.viewonly), awful.button({ modkey }, 1, awful.client.movetotag), awful.button({ }, 3, function (tag) tag.selected = not tag.selected end), awful.button({ modkey }, 3, awful.client.toggletag), awful.button({ }, 4, awful.tag.viewnext), awful.button({ }, 5, awful.tag.viewprev) ) mytasklist = {} mytasklist.buttons = awful.util.table.join ( awful.button({ }, 1, function (c) if not c:isvisible() then awful.tag.viewonly(c:tags()[1]) end client.focus = c c:raise() end), awful.button({ }, 3, function () if instance then instance:hide() end instance = awful.menu.clients({ width=250 }) 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) ) for s = 1, screen.count() do -- Create a promptbox for each screen mypromptbox[s] = awful.widget.prompt({ align = "left" }) -- Create an imagebox widget which will contains an icon indicating which layout we're using. -- We need one layoutbox per screen. mylayoutbox[s] = widget({ type = "imagebox", align = "left" }) mylayoutbox[s]:buttons(awful.util.table.join( awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) -- Create a taglist widget mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.label.all, mytaglist.buttons) -- Create a tasklist widget mytasklist[s] = awful.widget.tasklist(function(c) return awful.widget.tasklist.label.currenttags(c, s) end, mytasklist.buttons) -- Create the wibox mywibox[s] = wibox({ position = "top", fg = beautiful.fg_normal, bg = beautiful.bg_normal }) -- Add widgets to the wibox - order matters mywibox[s].widgets = { mylauncher, mytaglist[s], mylayoutbox[s], mytasklist[s], mypromptbox[s], -- mytextbox, acpibox, volumebox, clockbox, s == 1 and mysystray or nil } mywibox[s].screen = s end -- }}} -- {{{ Mouse bindings root.buttons(awful.util.table.join( awful.button({ }, 3, function () mymainmenu:toggle() end), awful.button({ }, 4, awful.tag.viewnext), awful.button({ }, 5, awful.tag.viewprev) )) -- }}} -- {{{ Key bindings globalkeys = { awful.key({ modkey, }, "Left", awful.tag.viewprev ), awful.key({ modkey, }, "Right", awful.tag.viewnext ), awful.key({ modkey, }, "Escape", awful.tag.history.restore), awful.key({ modkey, }, "j", function () awful.client.focus.byidx( 1) if client.focus then client.focus:raise() end end), awful.key({ modkey, }, "k", function () awful.client.focus.byidx(-1) if client.focus then client.focus:raise() end end), -- Layout manipulation awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), awful.key({ modkey, "Control" }, "j", function () awful.screen.focus( 1) end), awful.key({ modkey, "Control" }, "k", function () awful.screen.focus(-1) end), awful.key({ modkey, }, "u", awful.client.urgent.jumpto), awful.key({ modkey, }, "Tab", function () awful.client.focus.history.previous() if client.focus then client.focus:raise() end end), -- Standard program awful.key({ modkey, }, "Return", function () awful.util.spawn(terminal) end), awful.key({ modkey, "Control" }, "r", awesome.restart), awful.key({ modkey, "Shift" }, "q", myquit), awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end), awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end), awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end), awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end), awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), -- Applications awful.key({ "Control", "Shift" }, "m", function () awful.util.spawn("~/bin/mutt.csh") end), awful.key({ "Control", "Shift" }, "i", function () awful.util.spawn("xterm -n irssi -name irssi -T irssi -e irssi") end), awful.key({ "Control", "Shift" }, "f", function () awful.util.spawn("firefox3") end), awful.key({ "Control", "Shift" }, "c", function () awful.util.spawn("claws-mail") end), awful.key({ "Control", "Shift" }, "k", function () awful.util.spawn("pidgin") end), awful.key({ "Control", "Shift" }, "z", function () awful.util.spawn("xterm -n fxterm -name fxterm -T fxterm") end), awful.key({ modkey }, "e", function () awful.util.spawn("rox") end), awful.key({ modkey }, "r", function () awful.util.spawn("gmrun") end), awful.key({ modkey }, "n", function () awful.util.spawn("xlock -allowroot -usefirst -mode blank") end), -- Personal ones (Sun keyboard) awful.key({ }, "Help", function () awful.util.spawn("xlock -allowroot -usefirst -mode blank") end), awful.key({ }, "SunStop", awful.tag.viewprev), awful.key({ }, "SunAgain", awful.tag.viewnext), awful.key({ }, "SunProps", function () awful.util.spawn("audacious -t") end), awful.key({ }, "Undo", function () awful.util.spawn("audacious -f") end), awful.key({ "Shift" }, "Undo", function () awful.util.spawn("audacious -r") end), awful.key({ }, "SunFront", function () awful.util.spawn("xterm -n fxterm -name fxterm -T fxterm") end), awful.key({ }, "SunCopy", function () awful.util.spawn(terminal) end), awful.key({ }, "SunOpen", function () awful.util.spawn("gmrun") end), -- awful.key({ }, "SunPaste", function () awful.util.spawn() end), -- awful.key({ }, "Paste", function () awful.util.spawn() end), -- awful.key({ }, "SunCut", function () awful.util.spawn() end), awful.key({ }, "SunAudioRaiseVolume", function () awful.util.spawn("mixer vol +3") end), awful.key({ }, "SunAudioLowerVolume", function () awful.util.spawn("mixer vol -3") end), awful.key({ }, "SunAudioMute", function () awful.util.spawn("/home/garga/bin/mute.sh") end), awful.key({ }, "SunPowerSwitch", myquit), -- Prompt awful.key({ modkey }, "F1", function () awful.prompt.run({ prompt = "Run: " }, mypromptbox[mouse.screen], awful.util.spawn, awful.completion.bash, awful.util.getdir("cache") .. "/history") end), awful.key({ modkey }, "F4", function () awful.prompt.run({ prompt = "Run Lua code: " }, mypromptbox[mouse.screen], awful.util.eval, awful.prompt.bash, awful.util.getdir("cache") .. "/history_eval") end), } -- Client awful tagging: this is useful to tag some clients and then do stuff like move to tag on them clientkeys = { awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end), awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end), awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ), awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), awful.key({ modkey, }, "o", awful.client.movetoscreen ), awful.key({ modkey, "Shift" }, "r", function (c) c:redraw() end), awful.key({ modkey }, "t", awful.client.togglemarked), awful.key({ modkey, "Control" }, "s", function (c) c.sticky = not c.sticky end), awful.key({ modkey,}, "m", function (c) c.maximized_horizontal = not c.maximized_horizontal c.maximized_vertical = not c.maximized_vertical end), awful.key({ modkey,}, ",", function (c) c.maximized_horizontal = not c.maximized_horizontal end), awful.key({ modkey,}, ".", function (c) c.maximized_vertical = not c.maximized_vertical end), } -- Compute the maximum number of digit we need, limited to 9 keynumber = 0 for s = 1, screen.count() do keynumber = math.min(9, math.max(#tags[s], keynumber)); end for i = 1, keynumber do table.foreach(awful.key({ modkey }, i, function () local screen = mouse.screen if tags[screen][i] then awful.tag.viewonly(tags[screen][i]) end end), function(_, k) table.insert(globalkeys, k) end) table.foreach(awful.key({ modkey, "Control" }, i, function () local screen = mouse.screen if tags[screen][i] then tags[screen][i].selected = not tags[screen][i].selected end end), function(_, k) table.insert(globalkeys, k) end) table.foreach(awful.key({ modkey, "Shift" }, i, function () if client.focus and tags[client.focus.screen][i] then awful.client.movetotag(tags[client.focus.screen][i]) end end), function(_, k) table.insert(globalkeys, k) end) table.foreach(awful.key({ modkey, "Control", "Shift" }, i, function () if client.focus and tags[client.focus.screen][i] then awful.client.toggletag(tags[client.focus.screen][i]) end end), function(_, k) table.insert(globalkeys, k) end) table.foreach(awful.key({ modkey, "Shift" }, "F" .. i, function () local screen = mouse.screen if tags[screen][i] then for k, c in pairs(awful.client.getmarked()) do awful.client.movetotag(tags[screen][i], c) end end end), function(_, k) table.insert(globalkeys, k) end) end -- Set keys root.keys(globalkeys) -- }}} -- {{{ Hooks -- Hook function to execute when focusing a client. awful.hooks.focus.register(function (c) if not awful.client.ismarked(c) then c.border_color = beautiful.border_focus end end) -- Hook function to execute when unfocusing a client. awful.hooks.unfocus.register(function (c) if not awful.client.ismarked(c) then c.border_color = beautiful.border_normal end end) -- Hook function to execute when marking a client awful.hooks.marked.register(function (c) c.border_color = beautiful.border_marked end) -- Hook function to execute when unmarking a client. awful.hooks.unmarked.register(function (c) c.border_color = beautiful.border_focus end) -- Hook function to execute when the mouse enters a client. -- awful.hooks.mouse_enter.register(function (c) -- -- Sloppy focus, but disabled for magnifier layout -- if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier -- and awful.client.focus.filter(c) then -- client.focus = c -- end -- end) -- Hook function to execute when a new client appears. awful.hooks.manage.register(function (c, startup) -- If we are not managing this application at startup, -- move it to the screen where the mouse is. -- We only do it for filtered windows (i.e. no dock, etc). if not startup and awful.client.focus.filter(c) then c.screen = mouse.screen end if use_titlebar then -- Add a titlebar awful.titlebar.add(c, { modkey = modkey }) end -- Add mouse bindings c:buttons(awful.util.table.join( awful.button({ }, 1, function (c) client.focus = c; c:raise() end), awful.button({ modkey }, 1, awful.mouse.client.move), awful.button({ modkey }, 3, awful.mouse.client.resize) )) -- New client may not receive focus -- if they're not focusable, so set border anyway. c.border_width = beautiful.border_width c.border_color = beautiful.border_normal -- Check if the application should be floating. local cls = c.class local inst = c.instance if floatapps[cls] then awful.client.floating.set(c, floatapps[cls]) elseif floatapps[inst] then awful.client.floating.set(c, floatapps[inst]) end -- Check if the application should be sticky if stickyapps[cls] or stickyapps[inst] then c.sticky = true end -- Check application->screen/tag mappings. local target if apptags[cls] then target = apptags[cls] elseif apptags[inst] then target = apptags[inst] end if target then c.screen = target.screen awful.client.movetotag(tags[target.screen][target.tag], c) end -- Do not leave applications appear off the screen or under top bar if not nocenterapps[cls] and not nocenterapps[inst] and not audacious[cls] and not audacious[inst] then awful.placement.centered(c, c.transient_for) end if not audacious[cls] and not audacious[inst] then awful.placement.no_offscreen(c) end -- Do this after tag mapping, so you don't see it on the wrong tag for a split second. client.focus = c -- Set key bindings c:keys(clientkeys) -- Set the windows at the slave, -- i.e. put it at the end of others instead of setting it master. -- awful.client.setslave(c) -- Honor size hints: if you want to drop the gaps between windows, set this to false. -- c.size_hints_honor = false end) -- Hook function to execute when arranging the screen. -- (tag switch, new client, etc) awful.hooks.arrange.register(function (screen) local layout = awful.layout.getname(awful.layout.get(screen)) if layout and beautiful["layout_" ..layout] then mylayoutbox[screen].image = image(beautiful["layout_" .. layout]) else mylayoutbox[screen].image = nil end -- Give focus to the latest client in history if no window has focus -- or if the current window is a desktop or a dock one. if not client.focus then local c = awful.client.focus.history.get(screen, 0) if c then client.focus = c end end end) -- Hook called every minute --awful.hooks.timer.register(60, function () -- mytextbox.text = os.date(" %a %b %d, %H:%M ") --end) -- Hook called every second awful.hooks.timer.register(1, function () volumebox.text = widget_volume() clockbox.text = widget_clock() --acpibox.text = widget_acpi() end) -- }}} awful.tag.setmwfact(0.3, tags[1][1]) awful.tag.setmwfact(0.3, tags[1][2]) -- Autostart os.execute("pgrep root-tail || ( sleep 1 ; /home/garga/bin/root-tail.sh ) &") -- os.execute("pgrep mutt || ( /home/garga/bin/mutt.csh ) &") -- os.execute("pgrep irssi || xterm -n irssi -name irssi -T irssi -e irssi &") -- os.execute("pgrep firefox || firefox3 &") -- os.execute("pgrep claws-mail || claws-mail &") os.execute("pgrep pidgin || pidgin &")