X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/f44dc93752cdaec77f605651f57d542200808fbe..c9a736ea91015cbfe76f3266b695b6834e64efa9:/.config/awesome/rc.lua?ds=inline diff --git a/.config/awesome/rc.lua b/.config/awesome/rc.lua index bb28643..f795500 100644 --- a/.config/awesome/rc.lua +++ b/.config/awesome/rc.lua @@ -7,17 +7,18 @@ require("beautiful") -- Notification library require("naughty") +--require("vicious") + +require("obvious.battery") +require("obvious.clock") + +--require("bashets.bashets") + -- Load Debian menu entries require("debian.menu") -- {{{ Variable definitions -- Themes define colours, icons, and wallpapers --- The default is a dark theme -theme_path = "/usr/share/awesome/themes/default/theme.lua" --- Uncommment this for a lighter theme --- theme_path = "/usr/share/awesome/themes/sky/theme.lua" - --- Actually load theme beautiful.init(theme_path) -- This is used later as the default terminal and editor to run. @@ -35,74 +36,98 @@ 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.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.spiral, +-- awful.layout.suit.spiral.dwindle, awful.layout.suit.max, - awful.layout.suit.max.fullscreen, +-- 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 --- OVERRULED BY TILEDAPPS BELOW -floatapps = -{ - -- by class - ["MPlayer"] = true, - ["pinentry"] = true, - ["GIMP"] = true, - ["twinkle"] = true, - ["Add-ons"] = true, - ["Play stream"] = true, - ["gscan2pdf"] = true, -} - --- Applications that should never float, assuming everything else floats --- (by instance) -tiledapps = -{ - ["urxvt"] = true, -} - --- Applications that should be maximised --- (by instance) -maxapps = -{ - ["Navigator"] = true, - -- jpilot is -v - ["-v"] = true, - ["Xpdf"] = true, - ["gscan2pdf"] = true -} - --- Applications to be moved to a pre-defined tag by class or instance. --- Use the screen and tags indices. -apptags = -{ - ["Navigator"] = { screen = 1, tag = 9 }, - -- jpilot is -v - ["-v"] = { screen = 1, tag = 8 }, -} +---- 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 +---- OVERRULED BY TILEDAPPS BELOW +--floatapps = +--{ +-- -- by class +-- ["MPlayer"] = true, +-- ["pinentry"] = true, +-- ["GIMP"] = true, +-- ["twinkle"] = true, +-- ["Add-ons"] = true, +-- ["Play stream"] = true, +-- ["gscan2pdf"] = true, +--} +-- +---- Applications that should never float, assuming everything else floats +---- (by instance) +--tiledapps = +--{ +-- ["urxvt"] = true, +--} +-- +---- Applications that should be maximised +---- (by instance) +--maxapps = +--{ +-- ["Navigator"] = true, +-- -- jpilot is -v +-- ["-v"] = true, +-- ["Xpdf"] = true, +-- ["gscan2pdf"] = true +--} +-- +---- Applications to be moved to a pre-defined tag by class or instance. +---- Use the screen and tags indices. +--apptags = +--{ +-- ["Navigator"] = { screen = 1, tag = 9 }, +-- -- jpilot is -v +-- ["-v"] = { screen = 1, tag = 8 }, +--} -- Define if we want to use titlebar on all applications. use_titlebar = false -- }}} -- {{{ Tags --- Define a tag table which hold all screen tags. tags = {} +tags.settings = { + { name = "1", layout = layouts[1] }, + { name = "2", layout = layouts[1] }, + { name = "3", layout = layouts[1] }, + { name = "4", layout = layouts[1] }, + { name = "5", layout = layouts[1] }, + { name = "6", layout = layouts[1] }, + { name = "7", layout = layouts[3] }, + { name = "8", layout = layouts[3] }, + { name = "9", layout = layouts[3] }, +} + +-- Define a tag table which hold all screen tags. for s = 1, screen.count() do - -- Each screen has its own tag table. - tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s) + 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 + +if screen.count() == 3 then + tags[2][1].selected = false + tags[2][9].selected = true end -- }}} @@ -126,11 +151,64 @@ mylauncher = awful.widget.launcher({ image = image(beautiful.awesome_icon), -- }}} -- {{{ Wibox + +-- {{{ Reusable separators +spacer = widget({ type = "textbox", name = "spacer" }) +separator = widget({ type = "textbox", name = "separator" }) +spacer.text = " " +separator.text = "٭" +-- }}} + +---- {{{ CPU usage and temperature +---- Widget icon +--cpuicon = widget({ type = "imagebox", name = "cpuicon" }) +--cpuicon.image = image(beautiful.widget_cpu) +---- Initialize widgets +--thermalwidget = widget({ type = "textbox", name = "thermalwidget" }) +--cpuwidget = awful.widget.graph({ layout = awful.widget.layout.horizontal.rightleft }) +---- Graph properties +--cpuwidget:set_width(50) +----cpuwidget:set_scale(false) +--cpuwidget:set_max_value(100) +--cpuwidget:set_background_color(beautiful.fg_off_widget) +--cpuwidget:set_border_color(beautiful.border_widget) +--cpuwidget:set_color(beautiful.fg_end_widget) +--cpuwidget:set_gradient_angle(0) +--cpuwidget:set_gradient_colors({ +-- beautiful.fg_end_widget, +-- beautiful.fg_center_widget, +-- beautiful.fg_widget }) +---- Register widgets +--vicious.register(cpuwidget, vicious.widgets.cpu, "$1") +--vicious.register(thermalwidget, vicious.widgets.thermal, "CPU: $1°C", 19, "hwmon0") +---- }}} + +-- Battery widget +--batterywidget = widget({ type = 'progressbar', name = 'batterywidget' }) +--batterywidget.width = 100 +--batterywidget.height = 0.8 +--batterywidget.gap = 1 +--batterywidget.border_padding = 1 +--batterywidget.border_width = 1 +--batterywidget.ticks_count = 10 +--batterywidget.ticks_gap = 1 +--batterywidget.vertical = false +--batterywidget:bar_properties_set('bat', { +-- bg = 'black', +-- fg = 'blue4', +-- fg_off = 'red', +-- reverse = false, +-- min_value = 0, +-- max_value = 100 +--}) + -- Create a textclock widget -mytextclock = awful.widget.textclock({ align = "right" }) +mytextclock = awful.widget.textclock({ align = "right" }, "%a %d %b %H:%M:%S", 1) -- Create a systray -mysystray = widget({ type = "systray" }) +mysystray = widget({ type = "systray", align = "right" }) + +mybatterybox = widget({ type = "textbox", name = "mybatterybox", align = "right" }) -- Create a wibox for each screen and add it mywibox = {} @@ -201,35 +279,25 @@ for s = 1, screen.count() do layout = awful.widget.layout.horizontal.leftright }, mylayoutbox[s], + spacer, mytextclock, - s == 1 and mysystray or nil, + spacer, separator, spacer, + obvious.battery.widget, +-- mybatterybox, +-- batterywidget, +-- spacer, separator, spacer, +-- cpuwidget.widget, +-- spacer, separator, spacer, +-- thermalwidget.widget, + spacer, + s == screen.count() and mysystray or nil, mytasklist[s], layout = awful.widget.layout.horizontal.rightleft } end --- }}} ---Battery widget -batterywidget = widget({ type = 'progressbar', name = 'batterywidget' }) -batterywidget.width = 100 -batterywidget.height = 0.8 -batterywidget.gap = 1 -batterywidget.border_padding = 1 -batterywidget.border_width = 1 -batterywidget.ticks_count = 10 -batterywidget.ticks_gap = 1 -batterywidget.vertical = false -batterywidget:bar_properties_set('bat', { - bg = 'black', - fg = 'blue4', - fg_off = 'red', - reverse = false, - min_value = 0, - max_value = 100 -}) -- }}} - -- {{{ Mouse bindings root.buttons(awful.util.table.join( awful.button({ }, 3, function () mymainmenu:toggle() end), @@ -243,10 +311,8 @@ globalkeys = awful.util.table.join( 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, "Shift" }, "Right", function () awful.screen.focus( 1) end), - awful.key({ modkey, "Shift" }, "Left", function () awful.screen.focus(-1) end), - awful.key({ modkey, "Shift" }, "h", awful.tag.viewprev ), - awful.key({ modkey, "Shift" }, "l", awful.tag.viewnext ), + awful.key({ modkey, "Shift" }, "Right", function () awful.screen.focus_relative( 1) end), + awful.key({ modkey, "Shift" }, "Left", function () awful.screen.focus_relative(-1) end), awful.key({ modkey, }, "k", function () @@ -297,7 +363,13 @@ globalkeys = awful.util.table.join( mypromptbox[mouse.screen].widget, awful.util.eval, nil, awful.util.getdir("cache") .. "/history_eval") - end) + end), + awful.key({ modkey }, "F1", function () awful.screen.focus(1) end), + awful.key({ modkey }, "F2", function () awful.screen.focus(2) end), + awful.key({ modkey }, "F3", function () awful.screen.focus(3) end), + awful.key({ modkey, "Shift" }, "F1", function () awful.client.movetoscreen(c, 1) end), + awful.key({ modkey, "Shift" }, "F2", function () awful.client.movetoscreen(c, 2) end), + awful.key({ modkey, "Shift" }, "F3", function () awful.client.movetoscreen(c, 3) end) ) clientkeys = awful.util.table.join( @@ -305,13 +377,27 @@ clientkeys = awful.util.table.join( 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, }, "o", function (c) awful.client.movetoscreen(c, c.screen-1) end), + awful.key({ modkey, }, "p", function (c) awful.client.movetoscreen(c, c.screen+1) end), awful.key({ modkey, "Shift" }, "r", function (c) c:redraw() end), + awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end), awful.key({ modkey, }, "n", function (c) c.minimized = not c.minimized end), awful.key({ modkey, }, "m", function (c) - c.maximized_horizontal = not c.maximized_horizontal - c.maximized_vertical = not c.maximized_vertical + -- silly lua can't do bitwise operations + if not c.maximized_horizontal and not c.maximized_vertical then + c.maximized_horizontal = true + c.maximized_vertical = true + elseif c.maximized_horizontal and c.maximized_vertical then + c.maximized_horizontal = false + c.maximized_vertical = true + elseif not c.maximized_horizontal and c.maximized_vertical then + c.maximized_horizontal = true + c.maximized_vertical = false + elseif c.maximized_horizontal and not c.maximized_vertical then + c.maximized_horizontal = false + c.maximized_vertical = false + end end) ) @@ -363,17 +449,25 @@ cmdmodkey = "Mod3" -- xmms2 & sound globalkeys = awful.util.table.join(globalkeys, - awful.key({ cmdmodkey }, "Prior", function () awful.util.spawn("amixer set Master 2+") end), - awful.key({ cmdmodkey }, "Next", function () awful.util.spawn("amixer set Master 2-") end), - awful.key({ cmdmodkey }, "Up", function () awful.util.spawn("amixer set PCM 2+") end), - awful.key({ cmdmodkey }, "Down", function () awful.util.spawn("amixer set PCM 2-") end), - awful.key({ cmdmodkey }, "Home", function () awful.util.spawn("amixer set Mic toggle") end), - awful.key({ cmdmodkey }, "End", function () awful.util.spawn("amixer set Master toggle") end), - awful.key({ cmdmodkey }, "Left", function () awful.util.spawn("xmms2 prev") end), - awful.key({ cmdmodkey }, "Right", function () awful.util.spawn("xmms2 next") end), - awful.key({ cmdmodkey }, "space", function () awful.util.spawn("xmms2 toggleplay") end), - awful.key({ cmdmodkey }, "backslash", function () awful.util.spawn_with_shell("xmms2 current | head -1 | xmessage -nearmouse -timeout 5 -file -") end), - awful.key({ cmdmodkey, "Shift" }, "backslash", function () awful.util.spawn_with_shell("xmms2 list | xmessage -nearmouse -timeout 5 -file -") end) + awful.key({ cmdmodkey }, "Prior", function () awful.util.spawn("pactl set-sink-volume 0 +2%") end), + awful.key({ cmdmodkey }, "Next", function () awful.util.spawn("pactl set-sink-volume 0 -2%") end), + awful.key({ cmdmodkey }, "Home", function () awful.util.spawn("pactl set-source-mute 1 toggle") end), + awful.key({ cmdmodkey }, "End", function () awful.util.spawn("pactl set-sink-mute 0 toggle") end), + awful.key({ cmdmodkey }, "Left", function () awful.util.spawn("nyxmms2 prev") end), + awful.key({ cmdmodkey }, "Right", function () awful.util.spawn("nyxmms2 next") end), + awful.key({ cmdmodkey }, "space", function () awful.util.spawn("nyxmms2 toggle") end), + awful.key({ cmdmodkey }, "backslash", function () + local f = io.popen('nyxmms2 current', 'r') + for s, t in string.gmatch(f:read(), '(%w+):%s+([^:]+)') do + naughty.notify({ title = s, text = t, timeout = 5 }) + end + f:close() + end), + awful.key({ cmdmodkey, "Shift" }, "backslash", function () + local f = io.popen('nyxmms2 list', 'r') + naughty.notify({ title = "Playlist", text = f:read("*a"), timeout = 15 }) + f:close() + end) ) -- misc apps @@ -381,11 +475,15 @@ globalkeys = awful.util.table.join(globalkeys, awful.key({ cmdmodkey }, "n", function () awful.util.spawn("sensible-browser") end), awful.key({ cmdmodkey }, "m", function () awful.util.spawn(terminal .. " -e mutt -f =store") end), awful.key({ cmdmodkey }, "t", function () awful.util.spawn(terminal) end), - awful.key({ cmdmodkey }, "c", function () awful.util.spawn(terminal .. " -e python") end), --- awful.key({ cmdmodkey }, "r", function () awful.util.spawn("gmrun") end), + awful.key({ cmdmodkey }, "y", function () awful.util.spawn(terminal .. " -e python") end), + awful.key({ cmdmodkey }, "c", function () awful.util.spawn("icedove") end), awful.key({ cmdmodkey }, "r", function () mypromptbox[mouse.screen]:run() end), - awful.key({ cmdmodkey }, "j", function () awful.util.spawn("jpilot") end), - awful.key({ cmdmodkey }, "x", function () awful.util.spawn_with_shell("/sbin/start-stop-daemon --start --background --exec /usr/bin/xscreensaver; xscreensaver-command -lock") end), + awful.key({ cmdmodkey }, "g", function () awful.util.spawn("gscan2pdf") end), + awful.key({ cmdmodkey }, "v", function () awful.util.spawn("virt-manager") end), + awful.key({ cmdmodkey }, "o", function () awful.util.spawn("okular") end), + awful.key({ cmdmodkey }, "l", function () awful.util.spawn("libreoffice") end), + awful.key({ cmdmodkey }, "i", function () awful.util.spawn(terminal .. " -title irc -name irc -e env MOSH_TITLE_NOPREFIX=true mosh -4 -- irc-host screen -dr irc") end), + awful.key({ cmdmodkey }, "x", function () awful.util.spawn_with_shell("/sbin/start-stop-daemon --start --background --exec /usr/bin/xscreensaver -- -no-capture-stderr -log ~/.tmp/xscreensaver.log; xscreensaver-command -lock") end), awful.key({ cmdmodkey, "Shift" }, "x", function () awful.util.spawn("xscreensaver-command -exit") end), awful.key(nil, "XF86ScreenSaver", function () awful.util.spawn("xset dpms force off") end) ) @@ -401,17 +499,21 @@ awful.rules.rules = { properties = { border_width = beautiful.border_width, border_color = beautiful.border_normal, focus = true, + floating = true, keys = clientkeys, - buttons = clientbuttons } }, - { rule = { class = "MPlayer" }, - properties = { floating = true } }, - { rule = { class = "pinentry" }, - properties = { floating = true } }, - { rule = { class = "gimp" }, - properties = { floating = true } }, - -- Set Firefox to always map on tags number 2 of screen 1. - -- { rule = { class = "Firefox" }, - -- properties = { tag = tags[1][2] } }, + buttons = clientbuttons }, + callback = awful.placement.centered + }, + { rule = { class = "URxvt" }, + properties = { floating = false } }, + { rule = { class = "URxvt", instance = "irc" }, + properties = { floating = false, tag = tags[screen.count()][screen.count() == 1 and 2 or 1], switchtotag = true } }, + { rule = { class = "Firefox", instance = "Navigator" }, + properties = { tag = tags[screen.count() == 3 and 2 or screen.count()][9], switchtotag = false, floating = false } }, + { rule = { class = "Icedove", instance = "Mail" }, + properties = { tag = tags[screen.count() == 3 and 2 or screen.count()][8], switchtotag = false, floating = false } }, + { rule = { class = "chromium" }, + properties = { tag = tags[screen.count() == 3 and 2 or screen.count()][9], switchtotag = false, floating = false } }, } -- }}} @@ -436,45 +538,98 @@ client.add_signal("manage", function (c, startup) -- 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.center_vertical(c) + --awful.placement.center_horizontal(c) awful.placement.no_overlap(c) awful.placement.no_offscreen(c) end end + c.size_hints_honor = false end) client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end) client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) --- }}} ---{{{ batt hook -local function get_bat() - local a = io.open("/sys/class/power_supply/BAT1/charge_full") - for line in a:lines() do - full = line - end - a:close() - local b = io.open("/sys/class/power_supply/BAT1/charge_now") - for line in b:lines() do - now = line - end - b:close() - batt=math.floor(now*100/full) - batterywidget:bar_data_add("bat",batt ) +function clear_urgency_flag(c) + print("property::urgent received for client: ", c) + io.flush () +-- if c.urgent then +-- c.urgent = false +-- end end ---}}} --- Set up some hooks -awful.hooks.timer.register(20, hook_battery) --- awful.hooks.timer.register(5, get_bat) --- }}} +client.add_signal("new", function (c) + c:add_signal("property::urgent", clear_urgency_flag) +end) --- Highlight statusbars on the screen that has focus, --- set this to false if you only have one screen or --- you don't like it :P -if screen.count() > 1 then - statusbar_highlight_focus = true -else - statusbar_highlight_focus = false +-- Hook called every sixty seconds +function hook_battery() + mybatterybox.text = " " .. get_acpibatt() .. " " end +-- }}} -hook_battery() +-- from https://blog.mister-muffin.de/2014/11/07/automatically-suspending-cpu-hungry-applications/ +--client.add_signal("focus", function(c) +-- if c.class == "Firefox" or c.class == "chromium" or c.class == "Icedove" then +-- awful.util.spawn("kill -CONT " .. c.pid) +-- end +--end) +--local capi = { timer = timer } +--client.add_signal("unfocus", function(c) +-- local timer_stop = capi.timer { timeout = 120 } +-- if c.class == "Firefox" or c.class == "chromium" or c.class == "Icedove" then +-- local send_sigstop = function () +-- timer_stop:stop() +-- if client.focus.pid ~= c.pid then +-- awful.util.spawn("kill -STOP " .. c.pid) +-- end +-- end +-- timer_stop:add_signal("timeout", send_sigstop) +-- timer_stop:start() +-- end +--end) + +-- {{{ Statusbar battery +-- +function get_acpibatt() + local f = io.popen('acpi -b', 'r') + if not f then + return "acpi -b failed" + end + + local s = f:read('*l') + f:close() + if not s then + return '-'; + end + + -- Battery 0: Discharging, 89%, 00:02:14 remaining + -- Battery 0: Charging, 58%, 00:02:14 until charged + -- Battery 0: Full, 100% + -- so find the first bit first and then go look for the time + local st, en, status, percent = string.find(s, '%a+%s%d:%s(%a+),%s(%d+%%)'); + local st, en, time = string.find(s, ',%s(%d+:%d+):%d+%s%a+', en); + + if not status or not percent then -- time can be empty if we're full + return "couldn't parse line " .. s + end + + if not time then + return percent + end + + if status == 'Charging' then + return '↑ ' .. percent; + elseif status == 'Discharging' then + return '↓ '.. time; + else + return ''; + end +end +--t = timer({ timeout = 20 }) +--t:add_signal('timeout', hook_battery) +--t:start() +--hook_battery() +--bashets.register_lua(mybatterybox, get_acpibatt, '%1', 30) +--bashets.start() +-- }}}