madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

massive refactor for autorandr and other stuff
authormartin f. krafft <madduck@madduck.net>
Sun, 25 Feb 2018 10:21:08 +0000 (23:21 +1300)
committermartin f. krafft <madduck@madduck.net>
Sun, 25 Feb 2018 10:21:39 +0000 (23:21 +1300)
63 files changed:
.config/awesome/cryptocoin_widgets.lua
.config/awesome/debugfunc.lua [new file with mode: 0644]
.config/awesome/rc.lua
.config/awesome/taghelpers.lua [new file with mode: 0644]
.config/awesome/theme/README [new file with mode: 0644]
.config/awesome/theme/background.png [new file with mode: 0644]
.config/awesome/theme/background_white.png [new file with mode: 0644]
.config/awesome/theme/layouts/cornerne.png [new file with mode: 0644]
.config/awesome/theme/layouts/cornernew.png [new file with mode: 0644]
.config/awesome/theme/layouts/cornernw.png [new file with mode: 0644]
.config/awesome/theme/layouts/cornernww.png [new file with mode: 0644]
.config/awesome/theme/layouts/cornerse.png [new file with mode: 0644]
.config/awesome/theme/layouts/cornersew.png [new file with mode: 0644]
.config/awesome/theme/layouts/cornersw.png [new file with mode: 0644]
.config/awesome/theme/layouts/cornersww.png [new file with mode: 0644]
.config/awesome/theme/layouts/dwindle.png [new file with mode: 0644]
.config/awesome/theme/layouts/dwindlew.png [new file with mode: 0644]
.config/awesome/theme/layouts/fairh.png [new file with mode: 0644]
.config/awesome/theme/layouts/fairhw.png [new file with mode: 0644]
.config/awesome/theme/layouts/fairv.png [new file with mode: 0644]
.config/awesome/theme/layouts/fairvw.png [new file with mode: 0644]
.config/awesome/theme/layouts/floating.png [new file with mode: 0644]
.config/awesome/theme/layouts/floatingw.png [new file with mode: 0644]
.config/awesome/theme/layouts/fullscreen.png [new file with mode: 0644]
.config/awesome/theme/layouts/fullscreenw.png [new file with mode: 0644]
.config/awesome/theme/layouts/magnifier.png [new file with mode: 0644]
.config/awesome/theme/layouts/magnifierw.png [new file with mode: 0644]
.config/awesome/theme/layouts/max.png [new file with mode: 0644]
.config/awesome/theme/layouts/maxw.png [new file with mode: 0644]
.config/awesome/theme/layouts/spiral.png [new file with mode: 0644]
.config/awesome/theme/layouts/spiralw.png [new file with mode: 0644]
.config/awesome/theme/layouts/tile.png [new file with mode: 0644]
.config/awesome/theme/layouts/tilebottom.png [new file with mode: 0644]
.config/awesome/theme/layouts/tilebottomw.png [new file with mode: 0644]
.config/awesome/theme/layouts/tileleft.png [new file with mode: 0644]
.config/awesome/theme/layouts/tileleftw.png [new file with mode: 0644]
.config/awesome/theme/layouts/tiletop.png [new file with mode: 0644]
.config/awesome/theme/layouts/tiletopw.png [new file with mode: 0644]
.config/awesome/theme/layouts/tilew.png [new file with mode: 0644]
.config/awesome/theme/submenu.png [new file with mode: 0644]
.config/awesome/theme/taglist/squarefw.png [new file with mode: 0644]
.config/awesome/theme/taglist/squarew.png [new file with mode: 0644]
.config/awesome/theme/theme.lua [new file with mode: 0644]
.config/awesome/theme/titlebar/close_focus.png [new file with mode: 0644]
.config/awesome/theme/titlebar/close_normal.png [new file with mode: 0644]
.config/awesome/theme/titlebar/floating_focus_active.png [new file with mode: 0644]
.config/awesome/theme/titlebar/floating_focus_inactive.png [new file with mode: 0644]
.config/awesome/theme/titlebar/floating_normal_active.png [new file with mode: 0644]
.config/awesome/theme/titlebar/floating_normal_inactive.png [new file with mode: 0644]
.config/awesome/theme/titlebar/maximized_focus_active.png [new file with mode: 0644]
.config/awesome/theme/titlebar/maximized_focus_inactive.png [new file with mode: 0644]
.config/awesome/theme/titlebar/maximized_normal_active.png [new file with mode: 0644]
.config/awesome/theme/titlebar/maximized_normal_inactive.png [new file with mode: 0644]
.config/awesome/theme/titlebar/minimize_focus.png [new file with mode: 0644]
.config/awesome/theme/titlebar/minimize_normal.png [new file with mode: 0644]
.config/awesome/theme/titlebar/ontop_focus_active.png [new file with mode: 0644]
.config/awesome/theme/titlebar/ontop_focus_inactive.png [new file with mode: 0644]
.config/awesome/theme/titlebar/ontop_normal_active.png [new file with mode: 0644]
.config/awesome/theme/titlebar/ontop_normal_inactive.png [new file with mode: 0644]
.config/awesome/theme/titlebar/sticky_focus_active.png [new file with mode: 0644]
.config/awesome/theme/titlebar/sticky_focus_inactive.png [new file with mode: 0644]
.config/awesome/theme/titlebar/sticky_normal_active.png [new file with mode: 0644]
.config/awesome/theme/titlebar/sticky_normal_inactive.png [new file with mode: 0644]

index e0f3d2a19a42b8ef928312871333b46f706ec2fa..4d83772648d579849f1cf540a99c6554cb1319e2 100644 (file)
@@ -1,6 +1,7 @@
 local dkjson = require("lain.util").dkjson
 local math = require("math")
 local lain = require("lain")
+local beautiful = require("beautiful")
 
 local widgets = {}
 
@@ -17,7 +18,7 @@ widgets.eth_widget = lain.widget.watch({
     timeout = 600,
     settings = function()
         widget:set_text(poloniex_price(output, 'BTC_ETH') .. " Ƀ/Ξ")
-    end
+    end,
 })
 
 local function coindesk_price(output, base, prec)
diff --git a/.config/awesome/debugfunc.lua b/.config/awesome/debugfunc.lua
new file mode 100644 (file)
index 0000000..1c7c8af
--- /dev/null
@@ -0,0 +1,30 @@
+gears = require("gears")
+
+local module = {}
+
+local function massage_args_for_debug_output(...)
+    local args = table.pack(...)
+    for i = 1,select('#', ...) do
+        args[i] = (args[i] and gears.debug.dump_return(args[i], i, 65535))
+                    or string.format('%d : %s', i, args[i])
+    end
+    return args
+end
+
+function module.sprintf(s, ...)
+    local args = massage_args_for_debug_output(...)
+    return string.format(s, table.unpack(args))
+end
+
+function module.printf(s, ...)
+    print(dsprintf(s, ...) or "(nil)")
+end
+
+function module.dump(...)
+    local args = massage_args_for_debug_output(...)
+    for _,v in ipairs(args) do
+        print(tostring(v))
+    end
+end
+
+return module
index 5a4db6934974182ac822b3522d3658825278ab76..3c7cdf34cc7c8944c1d4038fe845460d63e9d0f3 100644 (file)
@@ -5,6 +5,8 @@ local awful = require("awful")
 require("awful.autofocus")
 -- Widget and layout library
 local wibox = require("wibox")
+-- Tyrannical tab handling
+--local tyrannical = require("tyrannical")
 -- Theme handling library
 local beautiful = require("beautiful")
 local xrdb = beautiful.xresources
@@ -20,10 +22,11 @@ require("awful.hotkeys_popup.keys")
 local debian = require("debian.menu")
 local has_fdo, freedesktop = pcall(require, "freedesktop")
 -- Other libraries
-local tblutils = require("tblutils")
 local lain = require("lain")
 local ccwidgets = require("cryptocoin_widgets")
 local clocksarray = require("clocksarray")
+local dbg = require("debugfunc")
+local th = require("taghelpers")
 -- }}}
 
 -- {{{ Error handling
@@ -56,11 +59,10 @@ end
 --xrdb.set_dpi(120, screen[2])
 
 -- Themes define colours, icons, font and wallpapers.
-beautiful.init(gears.filesystem.get_themes_dir() .. "default/theme.lua")
-beautiful.font = 'Sans 10'
+beautiful.init(gears.filesystem.get_configuration_dir () .. "theme/theme.lua")
 
 -- This is used later as the default terminal and editor to run.
-terminal = "x-terminal-emulator"
+terminal = "rxvt-unicode"
 editor = os.getenv("EDITOR") or "editor"
 editor_cmd = terminal .. " -e " .. editor
 
@@ -73,29 +75,18 @@ modkey = "Mod4"
 cmdkey = "Mod3"
 
 -- Table of layouts to cover with awful.layout.inc, order matters.
+local layouts = {
+    default = awful.layout.suit.fair,
+    tiled = awful.layout.suit.tile,
+    floating = awful.layout.suit.floating,
+    maximised = awful.layout.suit.max
+}
 awful.layout.layouts = {
-    awful.layout.suit.floating,
-    awful.layout.suit.tile,
-    awful.layout.suit.tile.left,
-    awful.layout.suit.tile.bottom,
-    awful.layout.suit.tile.top,
-    awful.layout.suit.fair,
-    awful.layout.suit.fair.horizontal,
-    awful.layout.suit.spiral,
-    awful.layout.suit.spiral.dwindle,
-    awful.layout.suit.max,
-    awful.layout.suit.max.fullscreen,
-    awful.layout.suit.magnifier,
-    awful.layout.suit.corner.nw,
-    -- awful.layout.suit.corner.ne,
-    -- awful.layout.suit.corner.sw,
-    -- awful.layout.suit.corner.se,
+    layouts.default,
+    layouts.tiled,
+    layouts.maximised,
+    layouts.floating,
 }
-
-layout_default = awful.layout.layouts[6]
-layout_tiled = awful.layout.layouts[2]
-layout_maximised = awful.layout.layouts[10]
-layout_floating = awful.layout.layouts[1]
 -- }}}
 
 -- {{{ Helper functions
@@ -123,6 +114,14 @@ local function set_wallpaper(s)
         gears.wallpaper.maximized(wallpaper, s, true)
     end
 end
+
+local function centre_mouse_on_area(a)
+    mouse.coords({
+        x = a.x + a.width/2,
+        y = a.y + a.height/2,
+    }, true)
+end
+
 -- }}}
 
 -- {{{ Menu
@@ -162,8 +161,13 @@ menubar.utils.terminal = terminal -- Set the terminal for applications that requ
 -- }}}
 
 -- {{{ Wibar
+--local spacer = wibox.widget {
+--    color = beautiful.bg_minimize,
+--    forced_width = 4,
+--    widget = wibox.widget.separator
+--}
 local spacer = wibox.widget.textbox()
-spacer:set_text(' │ ')
+spacer:set_text(" │ ")
 
 -- Keyboard map indicator and switcher
 mykeyboardlayout = awful.widget.keyboardlayout()
@@ -229,105 +233,334 @@ local tasklist_buttons = gears.table.join(
                                           end))
 -- }}}
 
+-- {{{ Screens
+
 -- Re-set wallpaper when a screen's geometry changes (e.g. different resolution)
 screen.connect_signal("property::geometry", set_wallpaper)
 
--- {{{ Tags
-tags = {}
-tags.config = {}
-tags.config["main"] = {
-    t1 = { layout = layout_default, selected = true },
-    t2 = { layout = layout_default },
-    t3 = { layout = layout_tiled },
-    t4 = { layout = layout_tiled },
-    t5 = { layout = layout_tiled },
-    t6 = { layout = layout_floating },
-    t7 = { layout = layout_maximised },
-    t8 = { layout = layout_maximised },
-    t9 = { layout = layout_maximised },
-}
-tags.config["aux"] = {
-    t1 = { layout = layout_default, selected = true },
-    t2 = { layout = layout_default },
-    t3 = { layout = layout_tiled },
-    t4 = { layout = layout_floating },
-    t5 = { layout = layout_floating },
-    t6 = { layout = layout_floating },
-    t7 = { layout = layout_floating },
-    t8 = { layout = layout_floating },
-    t9 = { layout = layout_maximised },
-}
-
-screentags = {}
-screentags[1] = tags.config["main"]
-if screen.count() == 2 then -- aux screen is on the right
-  screentags[2] = tags.config["aux"]
-elseif screen.count() == 3 then -- main screen is still #1 in the middle
-  screentags[2] = tags.config["aux"]
-  screentags[3] = tags.config["aux"]
+-- {{{ Basic setup for screens
+local function screen_set_profile(s, profile)
+    s.profile = profile
+    s.outputstr = table.concat(gears.table.keys(s.outputs), "+")
+    s.name = s.profile .. "/" .. s.outputstr
 end
 
 awful.screen.connect_for_each_screen(function(s)
-    -- local fontsize = math.floor(250 * xrdb.get_dpi(s)/s.geometry.width)
-    -- beautiful.font = "Sans " .. tostring(fontsize)
 
-    if not tags[s.index] then
-        tags[s.index] = {}
-    end
-    for n,p in tblutils.sorted_pairs(screentags[s.index]) do
-        p["screen"] = s
-        n = string.sub(n, 2) -- remove leading 't' needed for syntax in table
-        table.insert(tags[s.index], awful.tag.add(n, p))
-    end
+    s.set_profile = screen_set_profile
+
+    -- Wallpaper
+    set_wallpaper(s)
+
+    -- Create a text widget to display screen name
+    s.namebox = wibox.container.background(wibox.widget.textbox(s.name),
+      beautiful.bg_minimize)
 
     -- Create a promptbox for each screen
-    mypromptbox[s] = awful.widget.prompt()
+    s.mypromptbox = awful.widget.prompt()
     -- Create an imagebox widget which will contains an icon indicating which layout we're using.
     -- We need one layoutbox per screen.
-    mylayoutbox[s] = awful.widget.layoutbox(s)
-    mylayoutbox[s]:buttons(awful.util.table.join(
+    s.mylayoutbox = awful.widget.layoutbox(s)
+    s.mylayoutbox:buttons(awful.util.table.join(
                            awful.button({ }, 1, function () awful.layout.inc( 1) end),
                            awful.button({ }, 3, function () awful.layout.inc(-1) end),
                            awful.button({ }, 4, function () awful.layout.inc( 1) end),
                            awful.button({ }, 5, function () awful.layout.inc(-1) end)))
     -- Create a taglist widget
-    mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons)
+    s.mytaglist = awful.widget.taglist(s, awful.widget.taglist.filter.all, taglist_buttons)
 
     -- Create a tasklist widget
-    mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)
+    s.mytasklist = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, tasklist_buttons)
 
-    -- Create the wibox
-    mywibox[s] = awful.wibar({ position = "top", screen = s })
+    -- Create the wibox, but only if there isn't one yet
+    if not s.mywibox then
+        s.mywibox = awful.wibar({ position = "top", screen = s })
+    end
 
     -- Add widgets to the wibox
-    mywibox[s]:setup {
+    local right_widgets = gears.table.join(clocksarray, {
+        spacer,
+        --spacing = 4,
+        --spacing_widget = spacer,
+        s.mylayoutbox,
+        layout = wibox.layout.fixed.horizontal,
+    })
+
+    if s == screen.primary then
+        right_widgets = gears.table.join({
+            wibox.widget.systray(),
+            spacer,
+            ccwidgets.btc_widget,
+            spacer,
+            ccwidgets.eth_widget,
+            spacer,
+            lain_bat.widget,
+            spacer,
+        }, right_widgets)
+    end
+
+    s.mywibox:setup {
         layout = wibox.layout.align.horizontal,
         { -- Left widgets
+            spacing = 4,
+            spacing_widget = spacer,
             layout = wibox.layout.fixed.horizontal,
-            -- mylauncher,
-            mytaglist[s],
-            mypromptbox[s],
+            --s.namebox,
+            s.mytaglist,
+            s.mypromptbox,
         },
-        mytasklist[s], -- Middle widget
-        awful.util.table.join( -- Right widgets
-            {
-                layout = wibox.layout.fixed.horizontal,
-                mykeyboardlayout,
-                wibox.widget.systray(),
-                ccwidgets.btc_widget,
-                spacer,
-                ccwidgets.eth_widget,
-                spacer,
-                lain_bat.widget,
-                spacer,
-            },
-            clocksarray,
-            {
-                mylayoutbox[s],
-            }
-        ),
+        s.mytasklist, -- Middle widget
+        right_widgets,
     }
+end) -- }}}
+
+-- {{{ autorandr integration
+local function find_screen_by_name(name)
+    for s in screen do
+        if s.name == name then
+            return s
+        end
+    end
+end
+
+local function get_target_screen_for_tag(tag)
+    local function primary_screen(reason)
+        local s = screen.primary
+        local msg = "  → primary screen \"" .. s.name .. "\""
+        if reason then msg = msg .. " (" .. reason .. ")" end
+        print(msg)
+        return s
+    end
+
+    print("Figuring out target screen for tag " .. tag.name .. "…")
+    if tag.targets then
+        if type(tag.targets) == "table" then
+            for _,target in ipairs(tag.targets) do
+                local s = find_screen_by_name(target)
+                if s then
+                    print("  → screen " .. s.name)
+                    return s
+                end
+            end
+        elseif tag.targets == "primary" then
+            return primary_screen("explicit request")
+        end
+        return primary_screen("no matching target in " .. table.concat(tag.targets, ","))
+    else
+        return primary_screen("no targets specified")
+    end
+end
+
+local function move_tag_to_target_screen(tag)
+    tag.screen = get_target_screen_for_tag(tag)
+end
+
+local function move_tags_to_target_screens()
+    for _,tag in ipairs(root.tags()) do
+        move_tag_to_target_screen(tag)
+    end
+end
+
+tag.connect_signal("request::screen", function(t)
+    -- throw the tag onto any other screen, it'll get reassigned later when
+    -- a new profile has been processed.
+    for s in screen do
+        if s ~= t.screen then
+            t.screen = s
+            t.selected = false
+            break
+        end
+    end
+    naughty.notify({
+        title = "Screen removed",
+        text = "Salvaged tab " .. t.name .. " onto screen " .. t.screen.name,
+    })
 end)
+
+function handle_new_autorandr_profile(newprofile)
+    -- The main idea here is that autorandr invokes this via awesome-client
+    -- after switching to a new profile. Awesome will have already set up all
+    -- the screens long before this function is called. Therefore, we just do
+    -- the necessary modifications to the existing screens, and move tags
+    -- around.
+
+    if not newprofile then
+        error("Missing new profile name")
+    end
+
+    naughty.notify({
+        preset = naughty.config.presets.low,
+        title = "New autorandr profile",
+        text = "Reconfiguring for profile <b>" .. newprofile .. "</b>",
+    })
+
+    for s in screen do
+        s:set_profile(newprofile)
+    end
+    move_tags_to_target_screens()
+end
+
+local function initialise_to_autorandr_profile()
+    local profile
+
+    local function process_line(line)
+        if profile then return end
+        local match = string.match(line, "^([^%s]+) %(detected%)$")
+        if match then
+            profile = match
+        end
+    end
+
+    local function output_done()
+        if not profile then
+            error("autorandr detected no profile")
+            profile = "awesome"
+        end
+        handle_new_autorandr_profile(profile)
+    end
+
+    local function handle_exit(reason, code)
+        if not (reason == "exit" and code == 0) then
+            error("autorandr error: " .. reason .. ": " .. tostring(code))
+        end
+    end
+
+    awful.spawn.with_line_callback('autorandr', {
+        stderr = process_line,
+        output_done = output_done,
+        exit = handle_exit
+    })
+end
+awesome.connect_signal("startup", initialise_to_autorandr_profile)
+-- }}}
+
+-- }}}
+
+-- {{{ Tags
+
+local default_tag = {
+    name        = nil,
+    init        = true,
+    layout      = layouts.default,
+    fallback    = true,
+    targets     = "primary",
+}
+local default_tags = {}
+for i = 1, 9 do
+    default_tags[i] = {}
+    for k,v in pairs(default_tag) do
+        default_tags[i][k] = v
+    end
+    default_tags[i].name = tostring(i)
+end
+default_tags[1].selected = true
+
+default_tags = gears.table.join(default_tags, {
+  {
+    name        = "irc",
+    init        = true,
+    exclusive   = true,
+    master_width_factor = 0.33,
+    layout      = layouts.tiled,
+    selected    = true,
+    exec_once   = { terminal .. " -name irc -e env MOSH_TITLE_NOPREFIX=true mosh -4 -- irc-host tmux new -As irc irssi" },
+    instance    = { "irc" },
+    targets     = { "catalyst/eDP1", "mtvic/eDP1" },
+  },
+  {
+    name        = "[m]",
+    init        = true,
+    exclusive   = true,
+    master_width_factor = 0.67,
+    layout      = layouts.tiled,
+    selected    = true,
+    exec_once   = { "revolt" },
+    instance    = { "Revolt" },
+    targets     = { "catalyst/eDP1", "mtvic/eDP1" },
+  },
+  {
+    name        = "dflt",
+    init        = false,
+    fallback    = true,
+    layout      = layouts.floating,
+    volatile    = true,
+    selected    = true,
+  },
+  {
+    name        = "cal",
+    init        = true,
+    exclusive   = true,
+    layout      = layouts.default,
+    exec_once   = { "thunderbird" },
+    class       = { "Thunderbird" },
+    targets     = { "catalyst/HDMI1", "mtvic/eDP1" },
+  },
+  {
+    name        = "chr",
+    init        = true,
+    exclusive   = true,
+    layout      = layouts.default,
+    exec_once   = { "chromium" },
+    class       = { "Chromium" },
+    targets     = { "catalyst/HDMI1", "mtvic/eDP1" },
+  },
+  {
+    name        = "ffx",
+    init        = true,
+    exclusive   = true,
+    layout      = layouts.default,
+    exec_once   = { "firefox" },
+    class       = { "Firefox" },
+    targets     = { "catalyst/HDMI1", "mtvic/eDP1" },
+  },
+})
+
+if not tyrannical then
+
+for _,t in ipairs(default_tags) do
+    if t.init then
+        t.screen = t.screen or screen.primary
+        t.layout = t.layout or layouts.default
+        local newt = th.add_tag(t.name, t, false)
+    end
+end
+
+else -- {{{ tyrannical is loaded
+tyrannical.settings.default_layout = layouts.default
+tyrannical.settings.master_width_factor = 0.5
+tyrannical.settings.block_children_focus_stealing = true
+tyrannical.settings.group_children = true
+
+tyrannical.tags = default_tags
+
+tyrannical.properties.size_hints_honor = { URxvt = false }
+
+--XX---- Ignore the tag "exclusive" property for the following clients (matched by classes)
+--XX--tyrannical.properties.intrusive = {
+--XX--  "ksnapshot"     , "pinentry"       , "gtksu"     , "kcalc"        , "xcalc"               ,
+--XX--  "feh"           , "Gradient editor", "About KDE" , "Paste Special", "Background color"    ,
+--XX--  "kcolorchooser" , "plasmoidviewer" , "Xephyr"    , "kruler"       , "plasmaengineexplorer",
+--XX--}
+--XX--
+--XX---- Ignore the tiled layout for the matching clients
+--XX--tyrannical.properties.floating = {
+--XX--  "MPlayer"      , "pinentry"        , "ksnapshot"  , "pinentry"     , "gtksu"          ,
+--XX--  "xine"         , "feh"             , "kmix"       , "kcalc"        , "xcalc"          ,
+--XX--  "yakuake"      , "Select Color$"   , "kruler"     , "kcolorchooser", "Paste Special"  ,
+--XX--  "New Form"     , "Insert Picture"  , "kcharselect", "mythfrontend" , "plasmoidviewer"
+--XX--}
+--XX--
+--XX---- Make the matching clients (by classes) on top of the default layout
+--XX--tyrannical.properties.ontop = {
+--XX--  "Xephyr"       , "ksnapshot"       , "kruler"
+--XX--}
+--XX--
+--XX---- Force the matching clients (by classes) to be centered on the screen on init
+--XX--tyrannical.properties.centered = {
+--XX--  "kcalc"
+--XX--}
+end -- }}}
+
 -- }}}
 
 -- {{{ Mouse bindings
@@ -339,6 +572,24 @@ root.buttons(gears.table.join(
 -- }}}
 
 -- {{{ Key bindings
+
+local function toggle_tag_by_name(tagname, exclusive)
+    return function()
+        local t = awful.tag.find_by_name(nil, tagname)
+        if t then
+            if exclusive then
+                t:view_only()
+            else
+                awful.tag.viewtoggle(t)
+            end
+            cf = awful.client.getmaster(t.screen)
+            if cf then
+                cf:jump_to()
+            end
+        end
+    end
+end
+
 globalkeys = gears.table.join(
     awful.key({ modkey,           }, "s",      hotkeys_popup.show_help,
               {description="show help", group="awesome"}),
@@ -361,8 +612,6 @@ globalkeys = gears.table.join(
         end,
         {description = "focus previous by index", group = "client"}
     ),
-    awful.key({ modkey,           }, "w", function () mymainmenu:show() end,
-              {description = "show main menu", group = "awesome"}),
 
     -- Layout manipulation
     awful.key({ modkey, "Shift"   }, "k", function () awful.client.swap.byidx(  1)    end,
@@ -373,7 +622,7 @@ globalkeys = gears.table.join(
               {description = "focus the next screen", group = "screen"}),
     awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative(-1) end,
               {description = "focus the previous screen", group = "screen"}),
-    awful.key({ modkey,           }, "u", awful.client.urgent.jumpto,
+    awful.key({ modkey, "Shift"   }, "Return", awful.client.urgent.jumpto,
               {description = "jump to urgent client", group = "client"}),
     awful.key({ modkey,           }, "Tab",
         function ()
@@ -387,6 +636,11 @@ globalkeys = gears.table.join(
     -- Standard program
     awful.key({ modkey,           }, "Return", function () awful.spawn(terminal) end,
               {description = "open a terminal", group = "launcher"}),
+    awful.key({ modkey,           }, "r", function()
+        package.loaded.rc = nil
+        require("rc")
+    end,
+              {description = "reload rc.lua", group = "awesome"}),
     awful.key({ modkey, "Control" }, "r", awesome.restart,
               {description = "reload awesome", group = "awesome"}),
     awful.key({ modkey, "Shift"   }, "q", awesome.quit,
@@ -421,13 +675,59 @@ globalkeys = gears.table.join(
               {description = "restore minimized", group = "client"}),
 
     -- Prompt
-    awful.key({ modkey },            "r",     function () awful.screen.focused().mypromptbox:run() end,
+    awful.key({ cmdkey },            "r",
+              function ()
+                  local widget = awful.screen.focused().mypromptbox.widget
+                  local function spawn(command, args)
+                      gears.debug.dump(args)
+                      awful.spawn(command, args)
+                  end
+
+                  awful.prompt.run {
+                    prompt       = "Exec: ",
+                    bg_cursor    = '#ff0000',
+                    textbox      = widget,
+                    history_path = awful.util.get_cache_dir() .. "/history",
+                    hooks = {
+                        -- Replace the 'normal' Return with a custom one
+                        {{         }, 'Return', function(command)
+                            spawn(command)
+                        end},
+                        -- Spawn method to spawn in the current tag
+                        {{'Mod1'   }, 'Return', function(command)
+                            spawn(command,{
+                                intrusive = true,
+                                tag       = mouse.screen.selected_tag
+                            })
+                        end},
+                        -- Spawn in the current tag as floating and on top
+                        {{'Shift'  }, 'Return', function(command)
+                            spawn(command,{
+                                ontop     = true,
+                                floating  = true,
+                                tag       = mouse.screen.selected_tag
+                            })
+                        end},
+                        -- Spawn in a new tag
+                        {{'Control'}, 'Return', function(command)
+                            spawn(command,{
+                                new_tag = true,
+                                layout = layouts.default,
+                                volatile = true,
+                            })
+                        end},
+                        -- Cancel
+                        {{         }, 'Escape', function(_) return end},
+                    },
+                }
+        end,
               {description = "run prompt", group = "launcher"}),
 
     awful.key({ modkey }, "x",
               function ()
                   awful.prompt.run {
-                    prompt       = "Run Lua code: ",
+                    prompt       = "Eval: ",
+                    bg_cursor    = '#ff0000',
                     textbox      = awful.screen.focused().mypromptbox.widget,
                     exe_callback = awful.util.eval,
                     history_path = awful.util.get_cache_dir() .. "/history_eval"
@@ -435,9 +735,52 @@ globalkeys = gears.table.join(
               end,
               {description = "lua execute prompt", group = "awesome"}),
     -- Menubar
-    awful.key({ modkey }, "p", function() menubar.show() end,
-              {description = "show the menubar", group = "launcher"})
-)
+    awful.key({ modkey }, "w", function() menubar.show() end,
+              {description = "show the menubar", group = "launcher"}),
+
+    -- Tag helpers
+    awful.key({ modkey,           }, "a", function()
+        th.add_tag(nil, {layout=layouts.default} ,true)
+    end,
+    {description = "add a tag", group = "tag"}),
+    awful.key({ modkey,           }, "d", th.delete_tag,
+              {description = "delete the current tag", group = "tag"}),
+    awful.key({ modkey, "Shift",           }, "a", function()
+        move_to_new_tag(nil,nil,true,true,true)
+    end,
+              {description = "add a volatile tag with the focused client", group = "tag"}),
+    awful.key({ modkey, "Shift", "Control" }, "a", function()
+        move_to_new_tag(nil,nil,false,true,true)
+    end,
+              {description = "add a permanent tag with the focused client", group = "tag"}),
+    awful.key({ modkey, "Mod1"   }, "a", th.copy_tag,
+              {description = "create a copy of the current tag", group = "tag"}),
+    awful.key({ modkey, "Control"   }, "a", th.rename_tag,
+              {description = "rename the current tag", group = "tag"}),
+    awful.key({ modkey, "Control", "Shift", "Mod1" }, "a", th.collect_orphan_clients_to_tag,
+              {description = "collect all orphaned clients", group = "client"}),
+
+    awful.key({ modkey }, "y", toggle_tag_by_name("irc", true),
+              {description = "view tag 'irc'", group = "tag"}),
+    awful.key({ modkey, "Control" }, "y", toggle_tag_by_name("irc"),
+              {description = "toggle tag 'irc'", group = "tag"}),
+    awful.key({ modkey }, "u", toggle_tag_by_name("[m]", true),
+              {description = "view tag '[m]'", group = "tag"}),
+    awful.key({ modkey, "Control" }, "u", toggle_tag_by_name("[m]"),
+              {description = "toggle tag '[m]'", group = "tag"}),
+    awful.key({ modkey }, "i", toggle_tag_by_name("cal", true),
+              {description = "view tag 'cal'", group = "tag"}),
+    awful.key({ modkey, "Control" }, "i", toggle_tag_by_name("cal"),
+              {description = "toggle tag 'cal'", group = "tag"}),
+    awful.key({ modkey }, "o", toggle_tag_by_name("chr", true),
+              {description = "view tag 'chr'", group = "tag"}),
+    awful.key({ modkey, "Control" }, "o", toggle_tag_by_name("chr"),
+              {description = "toggle tag 'chr'", group = "tag"}),
+    awful.key({ modkey }, "p", toggle_tag_by_name("ffx", true),
+              {description = "view tag 'ff'", group = "tag"}),
+    awful.key({ modkey, "Control" }, "p", toggle_tag_by_name("ffx"),
+              {description = "toggle tag 'ff'", group = "tag"}),
+{})
 
 clientkeys = gears.table.join(
     awful.key({ modkey,           }, "f",
@@ -452,8 +795,6 @@ clientkeys = gears.table.join(
               {description = "toggle floating", group = "client"}),
     awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end,
               {description = "move to master", group = "client"}),
-    awful.key({ modkey,           }, "o",      function (c) c:move_to_screen()               end,
-              {description = "move to screen", group = "client"}),
     awful.key({ modkey,           }, "t",      function (c) c.ontop = not c.ontop            end,
               {description = "toggle keep on top", group = "client"}),
     awful.key({ modkey,           }, "n",
@@ -491,30 +832,16 @@ clientkeys = gears.table.join(
 for i = 1, 9 do
     globalkeys = gears.table.join(globalkeys,
         -- View tag only.
-        awful.key({ modkey }, "#" .. i + 9,
-                  function ()
-                        local screen = awful.screen.focused()
-                        local tag = screen.tags[i]
-                        if tag then
-                           tag:view_only()
-                        end
-                  end,
+        awful.key({ modkey }, "#" .. i + 9, toggle_tag_by_name(tostring(i), true),
                   {description = "view tag #"..i, group = "tag"}),
         -- Toggle tag display.
-        awful.key({ modkey, "Control" }, "#" .. i + 9,
-                  function ()
-                      local screen = awful.screen.focused()
-                      local tag = screen.tags[i]
-                      if tag then
-                         awful.tag.viewtoggle(tag)
-                      end
-                  end,
+        awful.key({ modkey, "Control" }, "#" .. i + 9, toggle_tag_by_name(tostring(i)),
                   {description = "toggle tag #" .. i, group = "tag"}),
         -- Move client to tag.
         awful.key({ modkey, "Shift" }, "#" .. i + 9,
                   function ()
                       if client.focus then
-                          local tag = client.focus.screen.tags[i]
+                          local tag = awful.tag.find_by_name(screen.primary, tostring(i))
                           if tag then
                               client.focus:move_to_tag(tag)
                           end
@@ -525,7 +852,7 @@ for i = 1, 9 do
         awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
                   function ()
                       if client.focus then
-                          local tag = client.focus.screen.tags[i]
+                          local tag = awful.tag.find_by_name(screen.primary, tostring(i))
                           if tag then
                               client.focus:toggle_tag(tag)
                           end
@@ -546,13 +873,16 @@ awful.key({ cmdkey }, "n", function () awful.spawn("firefox") end),
 awful.key({ cmdkey }, "m", function () awful.spawn("chromium --enable-remote-extensions") end),
 awful.key({ cmdkey }, "y", function () awful.spawn(terminal .. " -e python") end),
 awful.key({ cmdkey }, "c", function () awful.spawn("thunderbird") end),
-awful.key({ cmdkey }, "r", function () mypromptbox[mouse.screen]:run() end),
 awful.key({ cmdkey }, "g", function () awful.spawn("gscan2pdf") end),
 awful.key({ cmdkey }, "v", function () awful.spawn("virt-manager") end),
 awful.key({ cmdkey }, "l", function () awful.spawn("libreoffice") end),
 awful.key({ cmdkey }, "f", function () awful.spawn("thunar") end),
 awful.key({ cmdkey }, "i", function () awful.spawn(terminal .. " -name irc -e env MOSH_TITLE_NOPREFIX=true mosh -4 -- irc-host tmux new -As irc irssi") end),
-awful.key({ cmdkey }, "x", function () awful.spawn.with_shell("/sbin/start-stop-daemon --start --background --exec /usr/bin/xscreensaver -- -no-capture-stderr; sleep 2; xscreensaver-command -lock") end),
+awful.key({ cmdkey }, "x", function ()
+    awful.spawn("/usr/bin/xscreensaver -no-capture-stderr")
+    os.execute("sleep 5")
+    awful.spawn("xscreensaver-command -lock")
+end),
 awful.key({ cmdkey, "Shift" }, "x", function () awful.spawn("xscreensaver-command -exit") end),
 
 -- function keys
@@ -582,9 +912,30 @@ root.keys(globalkeys)
 -- {{{ Rules
 -- Rules to apply to new clients (through the "manage" signal).
 
-local function move_to_tag(s, t)
+local function float_client_in_the_middle_with_margins(client, leftright, topbottom)
+    local wa = client.screen.workarea
+    if topbottom then
+        client.y = wa.y + topbottom
+        client.height = wa.height - 2*topbottom
+    else
+        client.y = wa.y + (wa.height - client.height)/2
+    end
+    if leftright then
+        client.x = wa.x + leftright
+        client.width = wa.width - 2*leftright
+    else
+        client.x = wa.x + (wa.width - client.width)/2
+    end
+end
+
+local function move_to_tag_by_name(s, tagname)
     return function(c)
-        c:move_to_tag(tags[s][t])
+        local t = awful.tag.find_by_name(s, tagname)
+        if not t then
+            error("No tag by the name of " .. tagname)
+            return
+        end
+        c:move_to_tag(t)
     end
 end
 
@@ -599,87 +950,91 @@ awful.rules.rules = {
                      buttons = clientbuttons,
                      screen = awful.screen.preferred,
                      placement = awful.placement.no_overlap+awful.placement.no_offscreen,
-                     floating = false
+                     --floating = false
                  },
     },
-
-    -- Add titlebars to normal clients and dialogs
-    --DISABLED-- { rule_any = {type = { "normal", "dialog" }
-    --DISABLED--  }, properties = { titlebars_enabled = true }
-    --DISABLED-- },
-
     { rule = { type = "dialog" },
       properties = { floating = true,
+                     ontop = true,
+                     skip_taskbar = true,
+                     urgent = true,
+                     --new_tag = true,
+                     --switchtotag = true,
                      placement = awful.placement.centered
-                 }
+                   }
     },
-
     { rule = { class = "URxvt" },
-               properties = {
-                   -- floating = false,
-                   size_hints_honor = false
-               } },
-    { rule = { class = "URxvt", instance = "irc" },
-               properties = {
-                   switchtotag = true
-               },
-               callback = move_to_tag(screen.count(), screen.count() == 1 and 2 or 1)
-           },
-    { rule = { class = "Firefox", instance = "Navigator" },
-               properties = {
-                   floating = false,
-               },
-               callback = move_to_tag(screen.count() == 1 and 1 or 2, 9)
-           },
-    { rule = { class = "Firefox-esr", instance = "Navigator" },
-               properties = {
-                   floating = false,
-               },
-               callback = move_to_tag(screen.count() == 1 and 1 or 2, 9)
-           },
-    { rule = { class = "Thunderbird", instance = "Mail" },
-               properties = {
-                   floating = false,
-               },
-               callback = move_to_tag(screen.count() == 1 and 1 or 2, 8)
-           },
-    { rule = { class = "Chromium", instance = "chromium" },
-               properties = {
-                   floating = false,
-               },
-               callback = move_to_tag(screen.count() == 1 and 1 or 2, 9)
-           },
-    { rule = { class = "Gscan2pdf" },
-               properties = {
-                   switchtotag = true
-               },
-               callback = move_to_tag(1, 5)
-           },
-    { rule = { name = "gscan2pdf .*" },
-               properties = {
-                   floating = false,
-               },
-           },
-    { rule = { class = "Thunar", type = "normal" },
-               properties = {
-                   floating = false,
-               },
-           },
-    { rule = { class = "MuPDF", instance = "mupdf" },
-               properties = {
-                   floating = true,
-               },
-           },
-    { rule = { class = "Pinentry", instance = "pinentry" },
-               properties = {
-                   floating = true,
-               },
-           },
-    { rule = { class = "Gxmessage" },
-               properties = {
-                   floating = true,
-               },
-           },
+      properties = { size_hints_honor = false, }
+    },
+    { rule = { instance =  "irc" },
+      callback = move_to_tag_by_name(nil, "irc"),
+    },
+    { rule = { class = "Revolt" },
+      callback = move_to_tag_by_name(nil, "[m]"),
+    },
+    { rule = { class = "Firefox" },
+      callback = move_to_tag_by_name(nil, "ffx"),
+    },
+    { rule = { class = "Chromium" },
+      callback = move_to_tag_by_name(nil, "chr"),
+    },
+    { rule = { class = "Thunderbird" },
+      callback = move_to_tag_by_name(nil, "cal"),
+    },
+    { rule_any = { class = {
+        "MuPDF",
+        "Wicd-client.py",
+    }},
+      properties = { floating = true,
+                     focus = true,
+                     placement = function(c)
+                         float_client_in_the_middle_with_margins(c, 50, 25)
+                     end,
+                   },
+    },
+    { rule_any = { class = {
+                        "Gscan2pdf",
+                        "Gimp",
+                    },
+                    instance = {
+                        "libreoffice",
+                    }
+                },
+      properties = { new_tag = {
+                        layout = layouts.maximised,
+                        volatile = true,
+                    },
+                     switchtotag = true,
+                     focus = true,
+                   },
+    },
+--XX--    { rule = { class = "Gscan2pdf" },
+--XX--               properties = {
+--XX--                   switchtotag = true
+--XX--               },
+--XX--               callback = move_to_tag(1, 5)
+--XX--           },
+--XX--    { rule = { name = "gscan2pdf .*" },
+--XX--               properties = {
+--XX--                   floating = false,
+--XX--               },
+--XX--           },
+--XX--    { rule = { class = "Thunar", type = "normal" },
+--XX--               properties = {
+--XX--                   floating = false,
+--XX--               },
+--XX--           },
+--XX--    { rule = { class = "Pinentry", instance = "pinentry" },
+--XX--               properties = {
+--XX--                   floating = true,
+--XX--               },
+--XX--           },
+--XX--    { rule = { class = "Gxmessage" },
+--XX--               properties = {
+--XX--                   floating = true,
+--XX--               },
+--XX--           },
+--XX--}
 }
 -- }}}
 
@@ -688,7 +1043,7 @@ awful.rules.rules = {
 client.connect_signal("manage", function (c)
     -- Set the windows at the slave,
     -- i.e. put it at the end of others instead of setting it master.
-    if not awesome.startup then awful.client.setslave(c) end
+    -- if not awesome.startup then awful.client.setslave(c) end
 
     if awesome.startup and
       not c.size_hints.user_position
@@ -751,11 +1106,36 @@ client.connect_signal("mouse::enter", function(c)
     end
 end)
 
-client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
-client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
+client.connect_signal("focus", function(c)
+    c.border_color = beautiful.border_focus
+end)
+client.connect_signal("unfocus", function(c)
+    c.border_color = beautiful.border_normal
+end)
 
 awful.ewmh.add_activate_filter(function(c, context, hints)
-    if context == "ewmh" and (c.class == "Firefox-esr" or c.class == "Firefox") then return false end
+    if context == "ewmh" then
+        if (c.class == "Firefox-esr" or c.class == "Firefox") then
+            return false
+        end
+    end
+end)
+
+client.connect_signal("request::activate", function(c, context, hints)
+    if gears.table.hasitem({
+        "client.focus.byidx",
+        "client.jumpto",
+        "autofocus.check_focus",
+        "rules",
+        "ewmh",
+    }, context) then
+        gears.timer.delayed_call(function()
+            -- we need a delayed call so that we execute *after layout changes
+            centre_mouse_on_area(client.focus)
+        end)
+    else
+        dbg.dump(c, context, hints)
+    end
 end)
 
 -- vim:ft=lua:sw=4:sts=4:ts=4:et
diff --git a/.config/awesome/taghelpers.lua b/.config/awesome/taghelpers.lua
new file mode 100644 (file)
index 0000000..d3cc296
--- /dev/null
@@ -0,0 +1,101 @@
+local awful = require('awful')
+
+module = {}
+
+function module.delete_tag()
+    local t = awful.screen.focused().selected_tag
+    if not t then return end
+    t:delete()
+end
+
+local tmpcounter = 0
+function module.add_tag(name, properties, switchto, force)
+    local p = (type(properties) == "table" and properties) or {}
+    if not name then
+        name = name or string.format("t%d", tmpcounter)
+        tmpcounter = tmpcounter + 1
+    end
+    if not awful.tag.find_by_name(p.screen, name) or force then
+        p.screen = (p.screen
+            or (client.focus and client.focus.screen)
+            or awful.screen.focused())
+        local t = awful.tag.add(name, p)
+        if switchto then
+            t:view_only()
+        end
+        return t
+    else
+        local text = "A tag with name \"" .. name .. "\" already exists"
+        if p.screen then
+            text = text .. " (on screen " .. p.screen.name .. ")"
+        end
+        naughty.notify({
+            preset = naughty.config.presets.low,
+            title = "Add a new tag",
+            text = text
+        })
+    end
+end
+
+function module.rename_tag()
+    awful.prompt.run {
+        prompt       = "New tag name: ",
+        textbox      = awful.screen.focused().mypromptbox.widget,
+        exe_callback = function(new_name)
+            if not new_name or #new_name == 0 then return end
+
+            local t = awful.screen.focused().selected_tag
+            if t then
+                t.name = new_name
+            end
+        end
+    }
+end
+
+function module.move_to_new_tag(clnt, properties, volatile, switchto, force)
+    local c = clnt or client.focus
+    if not c then return end
+
+    local p = (type(properties) == "table" and properties) or {}
+    local s = p.screen or c.screen
+    local t = add_tag(c.class, {
+        screen = s,
+        volatile = volatile,
+    }, switchto, force)
+    c:move_to_tag(t)
+end
+
+function module.copy_tag()
+    local t = awful.screen.focused().selected_tag
+    if not t then return end
+
+    local clients = t:clients()
+    local t2 = awful.tag.add(t.name, awful.tag.getdata(t))
+    t2:clients(clients)
+    t2:view_only()
+end
+
+function module.collect_orphan_clients_to_tag(name)
+    local orphans = {}
+    for _,c in ipairs(client.get()) do
+        if #c:tags() == 0 then
+            orphans[#orphans+1] = c
+        end
+    end
+    if #orphans == 0 then
+        naughty.notify({text="No orphan clients found."})
+        return
+    end
+    local t = awful.tag.find_by_name(nil, name)
+    if not t then
+        t = add_tag("orphans", {
+                volatile = true,
+                screen = awful.screen.focused(),
+            }, true)
+    end
+    for _,c in ipairs(orphans) do
+        c:move_to_tag(t)
+    end
+end
+
+return module
diff --git a/.config/awesome/theme/README b/.config/awesome/theme/README
new file mode 100644 (file)
index 0000000..1ddb349
--- /dev/null
@@ -0,0 +1,3 @@
+Background images:
+    Mikael Eriksson <mikael_eriksson@miffe.org>
+    Licensed under CC-BY-SA-3.0
diff --git a/.config/awesome/theme/background.png b/.config/awesome/theme/background.png
new file mode 100644 (file)
index 0000000..d72a39e
Binary files /dev/null and b/.config/awesome/theme/background.png differ
diff --git a/.config/awesome/theme/background_white.png b/.config/awesome/theme/background_white.png
new file mode 100644 (file)
index 0000000..363ddd6
Binary files /dev/null and b/.config/awesome/theme/background_white.png differ
diff --git a/.config/awesome/theme/layouts/cornerne.png b/.config/awesome/theme/layouts/cornerne.png
new file mode 100644 (file)
index 0000000..76cd818
Binary files /dev/null and b/.config/awesome/theme/layouts/cornerne.png differ
diff --git a/.config/awesome/theme/layouts/cornernew.png b/.config/awesome/theme/layouts/cornernew.png
new file mode 100644 (file)
index 0000000..d9ff0a2
Binary files /dev/null and b/.config/awesome/theme/layouts/cornernew.png differ
diff --git a/.config/awesome/theme/layouts/cornernw.png b/.config/awesome/theme/layouts/cornernw.png
new file mode 100644 (file)
index 0000000..91f5818
Binary files /dev/null and b/.config/awesome/theme/layouts/cornernw.png differ
diff --git a/.config/awesome/theme/layouts/cornernww.png b/.config/awesome/theme/layouts/cornernww.png
new file mode 100644 (file)
index 0000000..9981311
Binary files /dev/null and b/.config/awesome/theme/layouts/cornernww.png differ
diff --git a/.config/awesome/theme/layouts/cornerse.png b/.config/awesome/theme/layouts/cornerse.png
new file mode 100644 (file)
index 0000000..3f03af7
Binary files /dev/null and b/.config/awesome/theme/layouts/cornerse.png differ
diff --git a/.config/awesome/theme/layouts/cornersew.png b/.config/awesome/theme/layouts/cornersew.png
new file mode 100644 (file)
index 0000000..627ff8c
Binary files /dev/null and b/.config/awesome/theme/layouts/cornersew.png differ
diff --git a/.config/awesome/theme/layouts/cornersw.png b/.config/awesome/theme/layouts/cornersw.png
new file mode 100644 (file)
index 0000000..089dd17
Binary files /dev/null and b/.config/awesome/theme/layouts/cornersw.png differ
diff --git a/.config/awesome/theme/layouts/cornersww.png b/.config/awesome/theme/layouts/cornersww.png
new file mode 100644 (file)
index 0000000..552afb7
Binary files /dev/null and b/.config/awesome/theme/layouts/cornersww.png differ
diff --git a/.config/awesome/theme/layouts/dwindle.png b/.config/awesome/theme/layouts/dwindle.png
new file mode 100644 (file)
index 0000000..0ec7a35
Binary files /dev/null and b/.config/awesome/theme/layouts/dwindle.png differ
diff --git a/.config/awesome/theme/layouts/dwindlew.png b/.config/awesome/theme/layouts/dwindlew.png
new file mode 100644 (file)
index 0000000..8457892
Binary files /dev/null and b/.config/awesome/theme/layouts/dwindlew.png differ
diff --git a/.config/awesome/theme/layouts/fairh.png b/.config/awesome/theme/layouts/fairh.png
new file mode 100644 (file)
index 0000000..3c2d36b
Binary files /dev/null and b/.config/awesome/theme/layouts/fairh.png differ
diff --git a/.config/awesome/theme/layouts/fairhw.png b/.config/awesome/theme/layouts/fairhw.png
new file mode 100644 (file)
index 0000000..410e292
Binary files /dev/null and b/.config/awesome/theme/layouts/fairhw.png differ
diff --git a/.config/awesome/theme/layouts/fairv.png b/.config/awesome/theme/layouts/fairv.png
new file mode 100644 (file)
index 0000000..ad99f4b
Binary files /dev/null and b/.config/awesome/theme/layouts/fairv.png differ
diff --git a/.config/awesome/theme/layouts/fairvw.png b/.config/awesome/theme/layouts/fairvw.png
new file mode 100644 (file)
index 0000000..1a4ee27
Binary files /dev/null and b/.config/awesome/theme/layouts/fairvw.png differ
diff --git a/.config/awesome/theme/layouts/floating.png b/.config/awesome/theme/layouts/floating.png
new file mode 100644 (file)
index 0000000..bf74990
Binary files /dev/null and b/.config/awesome/theme/layouts/floating.png differ
diff --git a/.config/awesome/theme/layouts/floatingw.png b/.config/awesome/theme/layouts/floatingw.png
new file mode 100644 (file)
index 0000000..7aecb06
Binary files /dev/null and b/.config/awesome/theme/layouts/floatingw.png differ
diff --git a/.config/awesome/theme/layouts/fullscreen.png b/.config/awesome/theme/layouts/fullscreen.png
new file mode 100644 (file)
index 0000000..d02f6fc
Binary files /dev/null and b/.config/awesome/theme/layouts/fullscreen.png differ
diff --git a/.config/awesome/theme/layouts/fullscreenw.png b/.config/awesome/theme/layouts/fullscreenw.png
new file mode 100644 (file)
index 0000000..5c35bfa
Binary files /dev/null and b/.config/awesome/theme/layouts/fullscreenw.png differ
diff --git a/.config/awesome/theme/layouts/magnifier.png b/.config/awesome/theme/layouts/magnifier.png
new file mode 100644 (file)
index 0000000..2ea2792
Binary files /dev/null and b/.config/awesome/theme/layouts/magnifier.png differ
diff --git a/.config/awesome/theme/layouts/magnifierw.png b/.config/awesome/theme/layouts/magnifierw.png
new file mode 100644 (file)
index 0000000..5cd5e16
Binary files /dev/null and b/.config/awesome/theme/layouts/magnifierw.png differ
diff --git a/.config/awesome/theme/layouts/max.png b/.config/awesome/theme/layouts/max.png
new file mode 100644 (file)
index 0000000..8d20844
Binary files /dev/null and b/.config/awesome/theme/layouts/max.png differ
diff --git a/.config/awesome/theme/layouts/maxw.png b/.config/awesome/theme/layouts/maxw.png
new file mode 100644 (file)
index 0000000..85f5ce3
Binary files /dev/null and b/.config/awesome/theme/layouts/maxw.png differ
diff --git a/.config/awesome/theme/layouts/spiral.png b/.config/awesome/theme/layouts/spiral.png
new file mode 100644 (file)
index 0000000..ca41814
Binary files /dev/null and b/.config/awesome/theme/layouts/spiral.png differ
diff --git a/.config/awesome/theme/layouts/spiralw.png b/.config/awesome/theme/layouts/spiralw.png
new file mode 100644 (file)
index 0000000..d128461
Binary files /dev/null and b/.config/awesome/theme/layouts/spiralw.png differ
diff --git a/.config/awesome/theme/layouts/tile.png b/.config/awesome/theme/layouts/tile.png
new file mode 100644 (file)
index 0000000..db1ce15
Binary files /dev/null and b/.config/awesome/theme/layouts/tile.png differ
diff --git a/.config/awesome/theme/layouts/tilebottom.png b/.config/awesome/theme/layouts/tilebottom.png
new file mode 100644 (file)
index 0000000..73a72fe
Binary files /dev/null and b/.config/awesome/theme/layouts/tilebottom.png differ
diff --git a/.config/awesome/theme/layouts/tilebottomw.png b/.config/awesome/theme/layouts/tilebottomw.png
new file mode 100644 (file)
index 0000000..64aa289
Binary files /dev/null and b/.config/awesome/theme/layouts/tilebottomw.png differ
diff --git a/.config/awesome/theme/layouts/tileleft.png b/.config/awesome/theme/layouts/tileleft.png
new file mode 100644 (file)
index 0000000..829475a
Binary files /dev/null and b/.config/awesome/theme/layouts/tileleft.png differ
diff --git a/.config/awesome/theme/layouts/tileleftw.png b/.config/awesome/theme/layouts/tileleftw.png
new file mode 100644 (file)
index 0000000..24c3941
Binary files /dev/null and b/.config/awesome/theme/layouts/tileleftw.png differ
diff --git a/.config/awesome/theme/layouts/tiletop.png b/.config/awesome/theme/layouts/tiletop.png
new file mode 100644 (file)
index 0000000..1964d4d
Binary files /dev/null and b/.config/awesome/theme/layouts/tiletop.png differ
diff --git a/.config/awesome/theme/layouts/tiletopw.png b/.config/awesome/theme/layouts/tiletopw.png
new file mode 100644 (file)
index 0000000..d2eee79
Binary files /dev/null and b/.config/awesome/theme/layouts/tiletopw.png differ
diff --git a/.config/awesome/theme/layouts/tilew.png b/.config/awesome/theme/layouts/tilew.png
new file mode 100644 (file)
index 0000000..4451a66
Binary files /dev/null and b/.config/awesome/theme/layouts/tilew.png differ
diff --git a/.config/awesome/theme/submenu.png b/.config/awesome/theme/submenu.png
new file mode 100644 (file)
index 0000000..b2778e2
Binary files /dev/null and b/.config/awesome/theme/submenu.png differ
diff --git a/.config/awesome/theme/taglist/squarefw.png b/.config/awesome/theme/taglist/squarefw.png
new file mode 100644 (file)
index 0000000..78de311
Binary files /dev/null and b/.config/awesome/theme/taglist/squarefw.png differ
diff --git a/.config/awesome/theme/taglist/squarew.png b/.config/awesome/theme/taglist/squarew.png
new file mode 100644 (file)
index 0000000..600e9ce
Binary files /dev/null and b/.config/awesome/theme/taglist/squarew.png differ
diff --git a/.config/awesome/theme/theme.lua b/.config/awesome/theme/theme.lua
new file mode 100644 (file)
index 0000000..9faefb6
--- /dev/null
@@ -0,0 +1,131 @@
+---------------------------
+-- Default awesome theme --
+---------------------------
+
+local theme_assets = require("beautiful.theme_assets")
+local xresources = require("beautiful.xresources")
+local dpi = xresources.apply_dpi
+
+local gfs = require("gears.filesystem")
+local themes_path = gfs.get_themes_dir()
+
+local theme = {}
+
+theme.font          = "sans 10"
+
+theme.bg_normal     = "#222222"
+theme.bg_focus      = "#535d6c"
+theme.bg_urgent     = "#ff0000"
+theme.bg_minimize   = "#444444"
+theme.bg_systray    = theme.bg_minimize
+
+theme.fg_normal     = "#aaaaaa"
+theme.fg_focus      = "#ffffff"
+theme.fg_urgent     = "#ffffff"
+theme.fg_minimize   = "#ffffff"
+
+theme.useless_gap   = dpi(0)
+theme.border_width  = dpi(2)
+theme.border_normal = "#cccccc"
+theme.border_focus  = "#00aa00"
+theme.border_marked = "#cc0000"
+
+-- There are other variable sets
+-- overriding the default one when
+-- defined, the sets are:
+-- taglist_[bg|fg]_[focus|urgent|occupied|empty|volatile]
+-- tasklist_[bg|fg]_[focus|urgent]
+-- titlebar_[bg|fg]_[normal|focus]
+-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color]
+-- mouse_finder_[color|timeout|animate_timeout|radius|factor]
+-- prompt_[fg|bg|fg_cursor|bg_cursor|font]
+-- hotkeys_[bg|fg|border_width|border_color|shape|opacity|modifiers_fg|label_bg|label_fg|group_margin|font|description_font]
+-- Example:
+--theme.taglist_bg_focus = "#ff0000"
+
+-- Generate taglist squares:
+local taglist_square_size = dpi(4)
+theme.taglist_squares_sel = theme_assets.taglist_squares_sel(
+    taglist_square_size, theme.fg_normal
+)
+theme.taglist_squares_unsel = theme_assets.taglist_squares_unsel(
+    taglist_square_size, theme.fg_normal
+)
+
+-- Variables set for theming notifications:
+-- notification_font
+-- notification_[bg|fg]
+-- notification_[width|height|margin]
+-- notification_[border_color|border_width|shape|opacity]
+
+-- Variables set for theming the menu:
+-- menu_[bg|fg]_[normal|focus]
+-- menu_[border_color|border_width]
+theme.menu_submenu_icon = themes_path.."default/submenu.png"
+theme.menu_height = dpi(15)
+theme.menu_width  = dpi(100)
+
+-- You can add as many variables as
+-- you wish and access them by using
+-- beautiful.variable in your rc.lua
+--theme.bg_widget = "#cc0000"
+
+-- Define the image to load
+theme.titlebar_close_button_normal = themes_path.."default/titlebar/close_normal.png"
+theme.titlebar_close_button_focus  = themes_path.."default/titlebar/close_focus.png"
+
+theme.titlebar_minimize_button_normal = themes_path.."default/titlebar/minimize_normal.png"
+theme.titlebar_minimize_button_focus  = themes_path.."default/titlebar/minimize_focus.png"
+
+theme.titlebar_ontop_button_normal_inactive = themes_path.."default/titlebar/ontop_normal_inactive.png"
+theme.titlebar_ontop_button_focus_inactive  = themes_path.."default/titlebar/ontop_focus_inactive.png"
+theme.titlebar_ontop_button_normal_active = themes_path.."default/titlebar/ontop_normal_active.png"
+theme.titlebar_ontop_button_focus_active  = themes_path.."default/titlebar/ontop_focus_active.png"
+
+theme.titlebar_sticky_button_normal_inactive = themes_path.."default/titlebar/sticky_normal_inactive.png"
+theme.titlebar_sticky_button_focus_inactive  = themes_path.."default/titlebar/sticky_focus_inactive.png"
+theme.titlebar_sticky_button_normal_active = themes_path.."default/titlebar/sticky_normal_active.png"
+theme.titlebar_sticky_button_focus_active  = themes_path.."default/titlebar/sticky_focus_active.png"
+
+theme.titlebar_floating_button_normal_inactive = themes_path.."default/titlebar/floating_normal_inactive.png"
+theme.titlebar_floating_button_focus_inactive  = themes_path.."default/titlebar/floating_focus_inactive.png"
+theme.titlebar_floating_button_normal_active = themes_path.."default/titlebar/floating_normal_active.png"
+theme.titlebar_floating_button_focus_active  = themes_path.."default/titlebar/floating_focus_active.png"
+
+theme.titlebar_maximized_button_normal_inactive = themes_path.."default/titlebar/maximized_normal_inactive.png"
+theme.titlebar_maximized_button_focus_inactive  = themes_path.."default/titlebar/maximized_focus_inactive.png"
+theme.titlebar_maximized_button_normal_active = themes_path.."default/titlebar/maximized_normal_active.png"
+theme.titlebar_maximized_button_focus_active  = themes_path.."default/titlebar/maximized_focus_active.png"
+
+theme.wallpaper = themes_path.."default/background.png"
+
+-- You can use your own layout icons like this:
+theme.layout_fairh = themes_path.."default/layouts/fairhw.png"
+theme.layout_fairv = themes_path.."default/layouts/fairvw.png"
+theme.layout_floating  = themes_path.."default/layouts/floatingw.png"
+theme.layout_magnifier = themes_path.."default/layouts/magnifierw.png"
+theme.layout_max = themes_path.."default/layouts/maxw.png"
+theme.layout_fullscreen = themes_path.."default/layouts/fullscreenw.png"
+theme.layout_tilebottom = themes_path.."default/layouts/tilebottomw.png"
+theme.layout_tileleft   = themes_path.."default/layouts/tileleftw.png"
+theme.layout_tile = themes_path.."default/layouts/tilew.png"
+theme.layout_tiletop = themes_path.."default/layouts/tiletopw.png"
+theme.layout_spiral  = themes_path.."default/layouts/spiralw.png"
+theme.layout_dwindle = themes_path.."default/layouts/dwindlew.png"
+theme.layout_cornernw = themes_path.."default/layouts/cornernww.png"
+theme.layout_cornerne = themes_path.."default/layouts/cornernew.png"
+theme.layout_cornersw = themes_path.."default/layouts/cornersww.png"
+theme.layout_cornerse = themes_path.."default/layouts/cornersew.png"
+
+-- Generate Awesome icon:
+theme.awesome_icon = theme_assets.awesome_icon(
+    theme.menu_height, theme.bg_focus, theme.fg_focus
+)
+
+-- Define the icon theme for application icons. If not set then the icons
+-- from /usr/share/icons and /usr/share/icons/hicolor will be used.
+theme.icon_theme = nil
+
+return theme
+
+-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
diff --git a/.config/awesome/theme/titlebar/close_focus.png b/.config/awesome/theme/titlebar/close_focus.png
new file mode 100644 (file)
index 0000000..e4763b6
Binary files /dev/null and b/.config/awesome/theme/titlebar/close_focus.png differ
diff --git a/.config/awesome/theme/titlebar/close_normal.png b/.config/awesome/theme/titlebar/close_normal.png
new file mode 100644 (file)
index 0000000..7702839
Binary files /dev/null and b/.config/awesome/theme/titlebar/close_normal.png differ
diff --git a/.config/awesome/theme/titlebar/floating_focus_active.png b/.config/awesome/theme/titlebar/floating_focus_active.png
new file mode 100644 (file)
index 0000000..80c1b4a
Binary files /dev/null and b/.config/awesome/theme/titlebar/floating_focus_active.png differ
diff --git a/.config/awesome/theme/titlebar/floating_focus_inactive.png b/.config/awesome/theme/titlebar/floating_focus_inactive.png
new file mode 100644 (file)
index 0000000..a96f00c
Binary files /dev/null and b/.config/awesome/theme/titlebar/floating_focus_inactive.png differ
diff --git a/.config/awesome/theme/titlebar/floating_normal_active.png b/.config/awesome/theme/titlebar/floating_normal_active.png
new file mode 100644 (file)
index 0000000..b9c70ca
Binary files /dev/null and b/.config/awesome/theme/titlebar/floating_normal_active.png differ
diff --git a/.config/awesome/theme/titlebar/floating_normal_inactive.png b/.config/awesome/theme/titlebar/floating_normal_inactive.png
new file mode 100644 (file)
index 0000000..55cbc0c
Binary files /dev/null and b/.config/awesome/theme/titlebar/floating_normal_inactive.png differ
diff --git a/.config/awesome/theme/titlebar/maximized_focus_active.png b/.config/awesome/theme/titlebar/maximized_focus_active.png
new file mode 100644 (file)
index 0000000..dad461d
Binary files /dev/null and b/.config/awesome/theme/titlebar/maximized_focus_active.png differ
diff --git a/.config/awesome/theme/titlebar/maximized_focus_inactive.png b/.config/awesome/theme/titlebar/maximized_focus_inactive.png
new file mode 100644 (file)
index 0000000..3cc46fe
Binary files /dev/null and b/.config/awesome/theme/titlebar/maximized_focus_inactive.png differ
diff --git a/.config/awesome/theme/titlebar/maximized_normal_active.png b/.config/awesome/theme/titlebar/maximized_normal_active.png
new file mode 100644 (file)
index 0000000..0bbbf6a
Binary files /dev/null and b/.config/awesome/theme/titlebar/maximized_normal_active.png differ
diff --git a/.config/awesome/theme/titlebar/maximized_normal_inactive.png b/.config/awesome/theme/titlebar/maximized_normal_inactive.png
new file mode 100644 (file)
index 0000000..5f1e98f
Binary files /dev/null and b/.config/awesome/theme/titlebar/maximized_normal_inactive.png differ
diff --git a/.config/awesome/theme/titlebar/minimize_focus.png b/.config/awesome/theme/titlebar/minimize_focus.png
new file mode 100644 (file)
index 0000000..733f6d1
Binary files /dev/null and b/.config/awesome/theme/titlebar/minimize_focus.png differ
diff --git a/.config/awesome/theme/titlebar/minimize_normal.png b/.config/awesome/theme/titlebar/minimize_normal.png
new file mode 100644 (file)
index 0000000..670a760
Binary files /dev/null and b/.config/awesome/theme/titlebar/minimize_normal.png differ
diff --git a/.config/awesome/theme/titlebar/ontop_focus_active.png b/.config/awesome/theme/titlebar/ontop_focus_active.png
new file mode 100644 (file)
index 0000000..d79c8e2
Binary files /dev/null and b/.config/awesome/theme/titlebar/ontop_focus_active.png differ
diff --git a/.config/awesome/theme/titlebar/ontop_focus_inactive.png b/.config/awesome/theme/titlebar/ontop_focus_inactive.png
new file mode 100644 (file)
index 0000000..03aef5a
Binary files /dev/null and b/.config/awesome/theme/titlebar/ontop_focus_inactive.png differ
diff --git a/.config/awesome/theme/titlebar/ontop_normal_active.png b/.config/awesome/theme/titlebar/ontop_normal_active.png
new file mode 100644 (file)
index 0000000..e09f32d
Binary files /dev/null and b/.config/awesome/theme/titlebar/ontop_normal_active.png differ
diff --git a/.config/awesome/theme/titlebar/ontop_normal_inactive.png b/.config/awesome/theme/titlebar/ontop_normal_inactive.png
new file mode 100644 (file)
index 0000000..9917b9e
Binary files /dev/null and b/.config/awesome/theme/titlebar/ontop_normal_inactive.png differ
diff --git a/.config/awesome/theme/titlebar/sticky_focus_active.png b/.config/awesome/theme/titlebar/sticky_focus_active.png
new file mode 100644 (file)
index 0000000..8019463
Binary files /dev/null and b/.config/awesome/theme/titlebar/sticky_focus_active.png differ
diff --git a/.config/awesome/theme/titlebar/sticky_focus_inactive.png b/.config/awesome/theme/titlebar/sticky_focus_inactive.png
new file mode 100644 (file)
index 0000000..6d7fe40
Binary files /dev/null and b/.config/awesome/theme/titlebar/sticky_focus_inactive.png differ
diff --git a/.config/awesome/theme/titlebar/sticky_normal_active.png b/.config/awesome/theme/titlebar/sticky_normal_active.png
new file mode 100644 (file)
index 0000000..0d003ef
Binary files /dev/null and b/.config/awesome/theme/titlebar/sticky_normal_active.png differ
diff --git a/.config/awesome/theme/titlebar/sticky_normal_inactive.png b/.config/awesome/theme/titlebar/sticky_normal_inactive.png
new file mode 100644 (file)
index 0000000..f1e8789
Binary files /dev/null and b/.config/awesome/theme/titlebar/sticky_normal_inactive.png differ