mirror of
https://github.com/beyondx/Notes.git
synced 2026-02-03 10:23:27 +08:00
1111 lines
30 KiB
Lua
1111 lines
30 KiB
Lua
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 '<bg color="' .. color .. '" />' .. text
|
||
end
|
||
|
||
-- Set foreground color
|
||
function fg(color, text)
|
||
return '<span color="' .. color .. '">' .. text .. '</span>'
|
||
end
|
||
|
||
-- Boldify text
|
||
function bold(text)
|
||
return '<b>' .. text .. '</b>'
|
||
end
|
||
|
||
-- Mono font
|
||
function mono(text)
|
||
return '<span font_desc=">' .. beautiful.font_mono .. '">' .. text .. '</span>'
|
||
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:
|