Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2011-05-30T17:40:15+08:00 ====== awesome ====== Created Monday 30 May 2011 http://wiki.freebsdchina.org/software/a/awesome awesome是一个很受欢迎,很小巧的平铺式窗口管理品。如果用心去配置的话,可以配置很令您满意的桌面出来。所说,它可以在平铺到多个显示器里面去 awesome的配置文件是使用使用lua语言去配置的。 当您安装好awesome后,请在$HOME/.config/里面建一个awesome目录,这个目录就是awesome配置的主目录了,而awesome目录的rc.lua就是主配置文件。(这些都是相对于awesome3而言的) 现在附出来我网上抄下来并小改了一下的awesome的配置文件,供参考。 -- geekounet's awesome 3 configuration file -- {{{ Initial stuffs ostype = io.popen("uname -s"):read() -- Call require or fail silently function require_or_fail(lib) result, value = pcall(require, lib) if result then return value else return nil end end -- }}} -- {{{ Libs -- Standard awesome library require("awful") package.path = awful.util.getdir("config") .. '/lib/?.lua;' .. package.path package.cpath = awful.util.getdir("config") .. '/lib/?.so;' .. package.cpath -- Autofocus library require("awful.autofocus") -- Theme handling library require("beautiful") -- Notification library require("naughty") -- MPD library mpd = require_or_fail("mpd") -- FreeBSD's sysctl library sysctl = require_or_fail("sysctl") -- }}} -- {{{ Variable definitions -- {{{ Paths home = os.getenv("HOME") config_dir = awful.util.getdir("config") themes_dir = config_dir .. "/themes/" -- }}} -- {{{ Theme theme = "akoya" theme_path = themes_dir .. "/" .. theme .. ".lua" beautiful.init(theme_path) -- }}} -- {{{ Programs terminal = "/home/minix/work/bin/mrxvt" terminal_exec = terminal .. " -e " editor = "/usr/local/bin/vim" editor_cmd = terminal_exec .. editor im = "/usr/local/bin/pidgin" music = "xmms" xlock = "xset dpms force off ; xtrlock" browser = "firefox3" mail = "thunderbird" -- will be mutt soon :P mixer_chan = "pcm" mixer = "mixer " .. mixer_chan .. " " sound_down = mixer .. "-2" sound_up = mixer .. "+2" sound_mute = "mute" -- mute comes from aumix package setup_mono = "xrandr --output LVDS --auto --output TMDS-1 --off" setup_dual = "xrandr --output LVDS --auto --output TMDS-1 --auto --right-of LVDS" -- }}} -- {{{ MPD clients if mpd then mpds = { add = function (self, c) table.insert(self.list, c) end, current = function (self) return self.list[self.current_idx] end, next = function (self) self.current_idx = math.fmod(self.current_idx, #self.list) + 1; end, previous = function (self) self.current_idx = math.fmod(self.current_idx - 1, #self.list); if self.current_idx <= 0 then self.current_idx = #self.list end end, -- private stuff list = { mpd.new({ desc = 'local', retry = 10 }) }, -- one (local) server by default current_idx = 1 } mpds:add(mpd.new { hostname = 'deathstar.home.poildetroll.net', desc = 'deathstar', retry = 10 }) end -- }}} -- {{{ Naughty if naughty then naughty.config.presets.normal.screen = screen.count() naughty.config.presets.normal.width = 250 naughty.config.presets.normal.fg = beautiful.naughty_fg naughty.config.presets.normal.bg = beautiful.naughty_bg naughty.config.presets.normal.height = 13 naughty.config.presets.critical.bg = beautiful.naughty_bg naughty.config.presets.critical.fg = beautiful.naughty_cri naughty.config.presets.critical.height = 13 end -- }}} -- {{{ Layouts layouts = { awful.layout.suit.tile, -- 1 awful.layout.suit.tile.left, -- 2 -- awful.layout.suit.tile.bottom, -- 3 awful.layout.suit.tile.top, -- 4 awful.layout.suit.fair, -- 5 awful.layout.suit.fair.horizontal, -- 6 awful.layout.suit.max, -- 7 awful.layout.suit.max.fullscreen, -- 8 awful.layout.suit.floating -- 9 } layouts_abbr = { ["tile"] = "TR", ["tileleft"] = "TL", -- ["tilebottom"] = "TB", ["tiletop"] = "TT", ["fairv"] = "FV", ["fairh"] = "FH", ["max"] = "MX", ["fullscreen"] = "FS", ["floating"] = "FL" } -- }}} -- {{{ Tags gold_number = 0.618033988769 default_mwfact = gold_number tags_name = { "main", "www", "mail", "irc", "im", "music", "dev", "admin", "foo", "bar", "baz", "qux" } tags_layout = { 1, 1, 1, 4, 9, 4, 1, 1, 1, 1, 1, 1 } tags_mwfact = { gold_number, gold_number, gold_number, (1 - gold_number), gold_number, (1 - gold_number), gold_number, gold_number, gold_number, gold_number, gold_number } -- }}} -- {{{ Floating clients and clients tagging floatapps = { ['feh'] = true, ['gajim.py'] = true, ['gimp'] = true, ["MPlayer"] = true, ["pinentry"] = true, ["pinentry-gtk-2"] = true, ['sonata'] = true, ['SDL_App'] = true, ['wpa_gui'] = true, ['xine'] = true } apptags = { ["Firefox"] = { tag = 2, 1 }, ["Iceweasel"] = { tag = 2, 1 }, ["Mail"] = { tag = 3, 1 }, ["Pidgin"] = { tag =5, 1 }, ["Thunderbird"] = { tag = 3, 1 }, ["Thunderbird-bin"] = { tag = 3, 1 }, ["Icedove-bin"] = { tag = 3, 1 }, ["gajim.py"] = { tag = 5, screen = screen.count() }, ["MPlayer"] = { screen = 1 }, } -- }}} -- {{{ Keys modkey = "Mod4" k_n = {} k_m = { modkey } k_ms = { modkey, "Shift" } k_ma = { modkey, "Alt" } k_mc = { modkey, "Control" } k_mcs = { modkey, "Control", "Shift" } k_a = { "Alt" } k_ac = { "Alt", "Control" } k_as = { "Alt", "Shift" } k_c = { "Control" } k_cs = { "Control", "Shift" } k_s = { "Shift" } -- }}} -- }}} -- {{{ Functions -- {{{ Utils -- 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 -- Mono font function mono(text) return '' .. text .. '' end -- Widget base function widget_base(content) if content and content ~= "" then return fg(beautiful.text_hilight, " [ ") .. content .. fg(beautiful.text_hilight, " ] ") end end -- Widget 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 .. fg(beautiful.text_hilight, " | ") .. next_section end else section = next_section end return section end -- Widget 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 .. fg(beautiful.text_hilight, ", ") .. next_value end else value = next_value end return value end -- Call sysctl.get() and return the value, -- or return nil if any error happens function sysctl_get(key) -- Ensure sysctl module is loaded if sysctl then result, value, type = pcall(sysctl.get, key) if result then return value else return nil end else return nil end end -- Read the first line of a file function readline(file) local f = io.open(file, "r") if f ~= nil then local c = f:read("*l") f:close() return c else return nil end end -- }}} -- {{{ Widgets -- Just a clock, %d/%m/%Y %H:%M:%S function widget_clock() return widget_base(os.date( bold("%H:%M"))) end -- Get and format MPD status -- (need the mpd lib for lua) function widget_mpd() local function timeformat(t) if tonumber(t) >= 60 * 60 then -- more than one hour ! return os.date("!%H:%M:%S", t) else return os.date("!%M:%S", t) end end local function unknownize(x) return awful.util.escape(x or "(unknown)") end local current_time, location, now_playing, state, status, times, total_time, volume if mpd then location = unknownize(mpds:current().desc) local status = mpds:current():send("status") if not status.state then state = "not running?" elseif status.state == "stop" then state = "stopped" else local song_stats = mpds:current():send("playlistid " .. status.songid) now_playing = string.format("%s - %s - %s", unknownize(song_stats.artist), unknownize(song_stats.album), unknownize(song_stats.title)) if status.state == "play" then state = "playing" else state = 'paused' end current_time = timeformat(status.time:match("(%d+):")) total_time = timeformat(status.time:match("%d+:(%d+)")) times = string.format("%s/%s", current_time, total_time) end if status.volume then volume = status.volume .. "%" end end return widget_base( widget_section("MPD", location, widget_section("State", state, widget_section("Track", now_playing, widget_section("Time", times, widget_section("Vol.", volume)))))) end -- Get and format ACPI informations function widget_acpi() local function urgent(text) if text then return bold(fg(beautiful.battery_low, text)) else return nil end end local acline, life, temp, time local ac_status, bat_status, bat_time, temp_status if ostype == "FreeBSD" and sysctl then life = sysctl_get("hw.acpi.battery.life") temp = sysctl_get("hw.acpi.thermal.tz0.temperature") acline = sysctl_get("hw.acpi.acline") if life then bat_status = life .. '%' end if acline == 1 then ac_status = 'on' else ac_status = 'off' if life and life ~= 100 then time = sysctl_get("hw.acpi.battery.time") if time then bat_time = os.date("!%Hh %Mm", time * 60) end if life < 10 then bat_status = urgent(bat_status) bat_time = urgent(bat_time) end end end if temp then temp = (temp - 2732.0) / 10 temp_status = temp .. '°C' if temp >= 80 then temp_status = urgent(temp_status) end end elseif ostype == "Linux" and lfs then local power_path = "/sys/class/power_supply" local thermal_path = "/sys/class/thermal" local attr, file, dev_path local battery, bat_charge_full, bat_charge_now, bat_current_now for file in lfs.dir(power_path) do dev_path = power_path .. "/" .. file attr = lfs.attributes(dev_path) assert(type(attr) == "table") if attr.mode == "directory" then if file:find("^AC") then -- AC status acline = readline(dev_path .. "/online") if acline == "1" then ac_status = "on" elseif acline == "0" then ac_status = "off" end -- if ac is nil (because the file would be missing?), nothing is set and it's fine elseif file:find("^BAT") then -- Battery status battery = readline(dev_path .. "/status") if battery then bat_charge_full = readline(dev_path .. "/charge_full") bat_charge_now = readline(dev_path .. "/charge_now") bat_current_now = math.abs(readline(dev_path .. "/current_now")) life = math.min(100, 100 * bat_charge_now / bat_charge_full) bat_status = string.format("%.2f%%", life) if battery == "Charging" then time = (bat_charge_full - bat_charge_now) / bat_current_now elseif battery == "Discharging" then time = bat_charge_now / bat_current_now end if time then bat_time = os.date("!%Hh %Mm", time * 60) end if life < 10 and battery == "Discharging" then bat_status = urgent(bat_status) bat_time = urgent(bat_time) end end end end end -- Temp status for file in lfs.dir(thermal_path) do dev_path = thermal_path .. "/" .. file attr = lfs.attributes (dev_path) assert(type(attr) == "table") if attr.mode == "directory" then temp = readline(dev_path .. "/temp") if temp then temp_status = temp / 1000 .. '°C' end end end end return widget_base( widget_section("AC", ac_status, widget_section("Bat.", widget_value(bat_status, bat_time), widget_section("T°", temp_status)))) end -- A widget displaying system stats local cpu_times_old function widget_sys() local function pages_to_bytes(pages, pagesize) local mem mem = (pages * pagesize) / (1024.0 * 1024.0) return string.format("%.2f", mem) end local function percentages(times, times_old) local i, j, change, diffs, out, total_changes total_change = 0 diffs = {} out = {} for i = 1, #times do change = times[i] - times_old[i] diffs[i] = change total_change = total_change + change end -- avoid divide by zero if not total_change then total_change = 1 end if total_change then for j = 1, #times do out[j] = (diffs[j] * 100) / total_change end end return out end local i, j, boottime, freq, lastpid, loadavg, uptime, vm local cpu_percentages, cpu_times, cpu_times_sub, cpu_times_old_sub, per_cpu_times local pagesize, active_pages, total_pages local cpu_text, freq_text, load_text, mem_text, pid_text, proc_text, uptime_text -- Continue only if sysctl is loaded if sysctl then -- CPU usage -- user, nice, system, interrupt, idle cpu_times = sysctl_get("kern.cp_times") if cpu_times then if cpu_times_old then per_cpu_times = {} for i = 0, #cpu_times / 5 - 1 do -- no point in doing a loop here cpu_times_sub = { cpu_times[i*5+1], cpu_times[i*5+2], cpu_times[i*5+3], cpu_times[i*5+4], cpu_times[i*5+5], } cpu_times_old_sub = { cpu_times_old[i*5+1], cpu_times_old[i*5+2], cpu_times_old[i*5+3], cpu_times_old[i*5+4], cpu_times_old[i*5+5], } cpu_percentages = percentages(cpu_times_sub, cpu_times_old_sub) -- cumulate all times but idle per_cpu_times[i+1] = cpu_percentages[1] + cpu_percentages[2] + cpu_percentages[3] + cpu_percentages[4] end for j = #per_cpu_times, 1, -1 do cpu_text = widget_value(string.format("%.1f%%", per_cpu_times[j]), cpu_text) end end cpu_times_old = cpu_times end -- Uptime boottime = sysctl_get("kern.boottime") if boottime then uptime = os.difftime(os.time(), boottime.sec) uptime_text = os.date("!%H:%M", uptime) days = uptime / (3600 * 24) if days >= 1 then uptime_text = string.format("%id ", days) .. uptime_text end end -- CPU frequency freq = sysctl_get("dev.cpu.0.freq") if freq then if freq < 1000 then freq_text = freq .. ' Mhz' else freq_text = freq / 1000 .. ' Ghz' end end -- VM vm = sysctl_get("vm.vmtotal") if vm then proc_text = widget_value(vm['rq'], widget_value(vm['dw'], widget_value(vm['pw'], widget_value(vm['sl'])))) end pagesize = sysctl_get("vm.stats.vm.v_page_size") active_pages = sysctl_get("vm.stats.vm.v_active_count") total_pages = sysctl_get("vm.stats.vm.v_page_count") if pagesize then if active_pages and total_pages then mem_text = pages_to_bytes(active_pages, pagesize) .. ' / ' .. pages_to_bytes(total_pages, pagesize) .. ' MiB' end end -- PID lastpid = sysctl_get("kern.lastpid") if lastpid then pid_text = lastpid end -- Load average loadavg = sysctl_get("vm.loadavg") if loadavg then for i, l in ipairs(loadavg) do load_text = widget_value(load_text, string.format("%.2f", l)) end end end return widget_base( widget_section("CPU", cpu_text, widget_section("Freq", freq_text, widget_section("Proc", proc_text, widget_section("Mem", mem_text, widget_section("Load", load_text, widget_section("Uptime", uptime_text))))))) -- widget_section("Last PID", pid_text)))))))) end -- Return abbreviation for the given layout function layout_abbr(layout) if layout then abbr = layouts_abbr[layout] if not abbr then abbr = "?" end else abbr = "x" end return widget_base(mono(abbr)) end -- }}} -- }}} -- {{{ Tags -- Define tags table tags = {} for s = 1, screen.count() do -- Each screen has its own tag table tags[s] = {} -- Create all tags on each screen for id, name in ipairs(tags_name) do tags[s][id] = tag { name = name } -- Add tags to screen one by one tags[s][id].screen = s awful.layout.set(layouts[tags_layout[id] or tags_layout[1]], tags[s][id]) if tags_mwfact[#tags[s]] then awful.tag.setmwfact(tags_mwfact[id], tags[s][id]) else awful.tag.setmwfact(default_mwfact, tags[s][id]) end end -- I'm sure you want to see at least one tag. tags[s][1].selected = true end -- }}} -- {{{ Wibox -- {{{ Clock widget clockbox = widget({ type = "textbox", align = "right" }) clockbox.text = widget_clock() -- }}} -- {{{ MPD widget mpdbox = widget({ type = "textbox", align = "right" }) mpdbox.text = "" -- }}} -- {{{ ACPI widget acpibox = widget({ type = "textbox", align = "right" }) acpibox.text = "" -- }}} -- {{{ System widget sysbox = widget({ type = "textbox", align = "left" }) sysbox.text = "" -- }}} -- {{{ And the wibox itself -- Create a wibox for each screen and add it witop = {} --wibottom = {} -- Prompt box mypromptbox = {} -- Layout box mylayoutbox = {} -- Tag list mytaglist = {} mytaglist.buttons = awful.util.table.join( awful.button(k_n, 1, awful.tag.viewonly), awful.button(k_m, 1, awful.client.movetotag), awful.button(k_n, 3, awful.tag.viewtoggle), awful.button(k_m, 3, awful.client.toggletag) ) function mytaglist.label_custom(t, args) if not args then args = {} end local theme = beautiful.get() local fg_focus = args.fg_focus or theme.taglist_fg_focus or theme.fg_focus local bg_focus = args.bg_focus or theme.taglist_bg_focus or theme.bg_focus local fg_urgent = args.fg_urgent or theme.taglist_fg_urgent or theme.fg_urgent local bg_urgent = args.bg_urgent or theme.taglist_bg_urgent or theme.bg_urgent local bg_color = nil local fg_color = nil local text = awful.util.escape(t.name) local sel = client.focus local cls = t:clients() if t.selected then bg_color = bg_focus fg_color = fg_focus end if not sel or not sel:tags()[t] then for k, c in pairs(t:clients()) do if c.urgent and not t.selected then if bg_urgent then bg_color = bg_urgent end if fg_urgent then fg_color = fg_urgent end break end end end if #cls > 0 then text = bold(text) end if bg_color and fg_color then text = fg(fg_color, text) end text = " " .. text .. " " return text, bg_color, nil, nil end for s = 1, screen.count() do -- Create a promptbox for each screen mypromptbox[s] = awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright }) -- Create one layoutbox per screen. mylayoutbox[s] = widget({ type = "textbox", 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) )) -- Create a taglist widget mytaglist[s] = awful.widget.taglist(s, mytaglist.label_custom, mytaglist.buttons) -- Create wiboxes witop[s] = awful.wibox({ position = "top", screen = s, height = beautiful.wibox_height, fg = beautiful.fg_normal, bg = beautiful.bg_normal }) -- wibottom[s] = awful.wibox({ position = "bottom", screen = s, height = beautiful.wibox_height, fg = beautiful.fg_normal, bg = beautiful.bg_normal }) -- Add widgets to wiboxes - order matters witop[s].widgets = { { mytaglist[s], mylayoutbox[s], mypromptbox[s], layout = awful.widget.layout.horizontal.leftright }, mpdbox, clockbox, layout = awful.widget.layout.horizontal.rightleft } -- wibottom[s].widgets = { -- { -- sysbox, -- layout = awful.widget.layout.horizontal.leftright -- }, -- acpibox, -- layout = awful.widget.layout.horizontal.rightleft end -- }}} -- }}} -- {{{ Mouse bindings root.buttons(awful.util.table.join( awful.button(k_n, 3, function () awful.util.spawn(terminal) end) )) clientbuttons = awful.util.table.join( awful.button(k_n, 1, function (c) client.focus = c; c:raise() end), awful.button(k_m, 1, awful.mouse.client.move), awful.button(k_m, 3, awful.mouse.client.resize) ) -- }}} -- {{{ Key bindings globalkeys = awful.util.table.join( -- {{{ Awesome quit/restart awful.key(k_mc, "r", awesome.restart), awful.key(k_ms, "q", awesome.quit), -- }}} -- {{{ Tags awful.key(k_m, "p", awful.tag.viewprev), -- awful.key(k_m, "p", awful.tag.viewprev), -- awful.key(k_m, "n", awful.tag.viewnext), awful.key(k_m, "n", awful.tag.viewnext), awful.key(k_m, "Escape", awful.tag.history.restore), -- }}} -- {{{ Client manipulation, global part awful.key(k_m, "j", function () awful.client.focus.byidx( 1); if client.focus then client.focus:raise() end end), awful.key(k_m, "k", function () awful.client.focus.byidx(-1); if client.focus then client.focus:raise() end end), awful.key(k_ms, "j", function () awful.client.swap.byidx( 1) end), awful.key(k_ms, "k", function () awful.client.swap.byidx(-1) end), awful.key(k_mc, "j", function () awful.screen.focus_relative( 1) end), awful.key(k_mc, "k", function () awful.screen.focus_relative(-1) end), awful.key(k_m, "u", awful.client.urgent.jumpto), awful.key(k_m, "Tab", function () awful.client.focus.history.previous() if client.focus then client.focus:raise() end end), -- }}} -- {{{ Layout manipulation awful.key(k_m, "l", function () awful.tag.incmwfact( 0.05) end), awful.key(k_m, "h", function () awful.tag.incmwfact(-0.05) end), awful.key(k_ms, "h", function () awful.tag.incnmaster( 1) end), awful.key(k_ms, "l", function () awful.tag.incnmaster(-1) end), awful.key(k_mc, "h", function () awful.tag.incncol( 1) end), awful.key(k_mc, "l", function () awful.tag.incncol(-1) end), awful.key(k_m, "space", function () awful.layout.inc(layouts, 1) end), awful.key(k_ms, "space", function () awful.layout.inc(layouts, -1) end), -- }}} -- {{{ Programs awful.key(k_m, "Return", function () awful.util.spawn(terminal) end), awful.key(k_m, "e", function () awful.util.spawn(editor_cmd) end), awful.key(k_c, "Return", function () awful.util.spawn(browser) end), awful.key(k_m, "m", function () awful.util.spawn(mail) end), awful.key(k_m, "i", function () awful.util.spawn(im) end), awful.key(k_m, "z", function () awful.util.spawn(music) end), awful.key(k_mc, "End", function () awful.util.spawn(xlock) end), awful.key(k_ms, "F5", function () awful.util.spawn(setup_mono) end), awful.key(k_ms, "F6", function () awful.util.spawn(setup_dual) end), -- }}} -- ------ {{ sdcv/stardict ----awful.key({ modkey }, "d", function () ---- local f = io.popen("xsel -o") ---- local new_word = f:read("*a") ---- f:close() ---- ---- if frame ~= nil then ---- naughty.destroy(frame) ---- frame = nil ---- if old_word == new_word then ---- return ---- end ---- end ---- old_word = new_word ---- ---- local fc = "" ---- local f = io.popen("sdcv"..new_word) ---- for line in f:lines() do ---- fc = fc .. line .. '\n' ---- end ---- f:close() ---- frame = naughty.notify({ text = fc, timeout = 10, width = 320 }) ----end), ----awful.key({ modkey, "Shift" }, "d", function () ---- awful.prompt.run({prompt = "Dict: "}, mypromptbox[mouse.screen].widget, function(cin_word) ---- naughty.destroy(frame) ---- if cin_word == "" then ---- return ---- end ---- ---- local fc = "" ---- local f = io.popen("sdcv"..cin_word) ---- for line in f:lines() do ---- fc = fc .. line .. '\n' ---- end ---- f:close() ---- frame = naughty.notify({ text = fc, timeout = 10, width = 320 }) ---- end, nil, awful.util.getdir("cache").."/dict") ----end), -- }}} -- }}} -- {{{ Prompts awful.key(k_m, "F1", function () mypromptbox[mouse.screen]:run() end), awful.key(k_m, "F4", function () awful.prompt.run({ prompt = "Run Lua code: " }, mypromptbox[mouse.screen].widget, awful.util.eval, nil, awful.util.getdir("cache") .. "/history_eval") end) -- }}} ) -- {{{ Client manipulation, client part) clientkeys = awful.util.table.join( awful.key(k_ms, "f", function (c) c.fullscreen = not c.fullscreen end), awful.key(k_ms, "c", function (c) c:kill() end), awful.key(k_mc, "space", awful.client.floating.toggle), awful.key(k_mc, "Return", function (c) c:swap(awful.client.getmaster()) end), awful.key(k_m, "o", awful.client.movetoscreen), awful.key(k_ms, "r", function (c) c:redraw() end), awful.key(k_ms, "m", function (c) c.maximized_horizontal = not c.maximized_horizontal c.maximized_vertical = not c.maximized_vertical end) ) -- }}} -- {{{ Assign keys for each tag -- Bind keyboard digits -- Compute the maximum number of digit we need, limited to 12 keynumber = 0 for s = 1, screen.count() do keynumber = math.min(12, math.max(#tags[s], keynumber)); end for i = 1, keynumber do if i == 11 then k = "minus" elseif i == 12 then k = "equal" else k = i % 10 -- 10 become 0 end globalkeys = awful.util.table.join(globalkeys, awful.key(k_m, k, function () local screen = mouse.screen if tags[screen][i] then awful.tag.viewonly(tags[screen][i]) end end), awful.key(k_mc, k, function () local screen = mouse.screen if tags[screen][i] then awful.tag.viewtoggle(tags[screen][i]) end end), awful.key(k_ms, k, function () if client.focus and tags[client.focus.screen][i] then awful.client.movetotag(tags[client.focus.screen][i]) end end), awful.key(k_mcs, k, function () if client.focus and tags[client.focus.screen][i] then awful.client.toggletag(tags[client.focus.screen][i]) end end)) end -- }}} -- Set keys root.keys(globalkeys) -- }}} -- {{{ Signals -- Signal function to execute when focusing a client. client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end) -- Signal function to execute when unfocusing a client. client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) -- Signal function to execute when a new client appears. client.add_signal("manage", function (c, startup) -- Set mouse bindings c:buttons(clientbuttons) -- Set key bindings c:keys(clientkeys) -- 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 -- Honor size hints c.size_hints_honor = true -- 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 application->screen/tag mappings. local target, screen if apptags[cls] then target = apptags[cls] elseif apptags[inst] then target = apptags[inst] end if target then if target.screen then screen = target.screen else screen = mouse.screen end c.screen = screen if target.tag then awful.client.movetotag(tags[screen][target.tag], c) else awful.client.movetoscreen(c, screen) end end -- Enable sloppy focus 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) if not startup then -- 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 -- Apply tags. awful.tag.withcurrent(c, startup) -- Do this after tag mapping, so you don't see it on the wrong tag for a split second. client.focus = c end) -- Signal function to execute when switching layout. for s = 1, screen.count() do local function update_layoutbox(tag) mylayoutbox[tag.screen].text = layout_abbr(awful.layout.getname(awful.layout.get(tag.screen))) end awful.tag.attached_add_signal(s, "property::selected", update_layoutbox) awful.tag.attached_add_signal(s, "property::layout", update_layoutbox) end -- Timer updating clock and mpd widgets every 0.2 second clock_timer = timer { timeout = 0.2 } clock_timer:add_signal("timeout", function () clockbox.text = widget_clock() mpdbox.text = widget_mpd() end) clock_timer:start() -- Timer updating acpi and system widgets every 2 seconds sys_timer = timer { timeout = 2 } sys_timer:add_signal("timeout", function () acpibox.text = widget_acpi() sysbox.text = widget_sys() end) sys_timer:start() -- }}} -- vim:filetype=lua:tabstop=8:shiftwidth=2:fdm=marker: