From a42d6789e8c689df0e80849d7183525a04e2dcfe Mon Sep 17 00:00:00 2001 From: Tom Ryder Date: Sat, 14 Sep 2013 23:55:55 +1200 Subject: Switched window managers from awesome to i3 No hard feelings, awesome --- README.markdown | 20 ++-- X/xsession | 2 +- X/xsessionrc | 1 + awesome/rc.lua | 358 -------------------------------------------------------- i3/config | 108 +++++++++++++++++ i3/status | 12 ++ install | 2 +- 7 files changed, 133 insertions(+), 370 deletions(-) delete mode 100644 awesome/rc.lua create mode 100644 i3/config create mode 100644 i3/status diff --git a/README.markdown b/README.markdown index 4ace08c7..b3b4ca41 100644 --- a/README.markdown +++ b/README.markdown @@ -32,13 +32,13 @@ Configuration is included for: * [ack][2] — Perl alternative to `grep(1)`, including a copy of its standalone version -* [awesome][3] — Tiling window manager -* [Bash][4] — GNU Bourne-Again Shell, including a `~/.profile` configured to +* [Bash][3] — GNU Bourne-Again Shell, including a `~/.profile` configured to work with most Bourne-compatible shells -* [cURL][5] — Command-line tool for transferring data with URL syntax -* [Git][6] — Distributed version control system -* [GnuPG][7] — GNU Privacy Guard, for private communication and file +* [cURL][4] — Command-line tool for transferring data with URL syntax +* [Git][5] — Distributed version control system +* [GnuPG][6] — GNU Privacy Guard, for private communication and file encryption +* [i3wm][7] — Tiling window manager * [Mutt][8] — Terminal mail user agent * [Newsbeuter][9] — Terminal RSS/Atom feed reader * [Perl::Critic][10] — Static analysis tool for Perl code @@ -159,11 +159,11 @@ next time you’re in New Zealand. [1]: http://git-scm.com/book/en/Git-Tools-Submodules [2]: http://beyondgrep.com/ -[3]: http://awesome.naquadah.org/ -[4]: https://www.gnu.org/software/bash/ -[5]: http://curl.haxx.se/ -[6]: http://git-scm.com/ -[7]: http://www.gnupg.org/ +[3]: https://www.gnu.org/software/bash/ +[4]: http://curl.haxx.se/ +[5]: http://git-scm.com/ +[6]: http://www.gnupg.org/ +[7]: http://i3wm.org/ [8]: http://www.mutt.org/ [9]: http://www.newsbeuter.org/ [10]: http://search.cpan.org/~thaljef/Perl-Critic-1.118/lib/Perl/Critic.pm diff --git a/X/xsession b/X/xsession index 2bf35090..37179a59 100644 --- a/X/xsession +++ b/X/xsession @@ -1,3 +1,3 @@ #!/usr/bin/env bash -exec awesome +exec i3 diff --git a/X/xsessionrc b/X/xsessionrc index 9a783fa6..00f120e3 100644 --- a/X/xsessionrc +++ b/X/xsessionrc @@ -1,3 +1,4 @@ +feh --bg-scale "$HOME"/.i3/draugen.jpg xmodmap ~/.Xmodmap xscreensaver & diff --git a/awesome/rc.lua b/awesome/rc.lua deleted file mode 100644 index f7fdc58c..00000000 --- a/awesome/rc.lua +++ /dev/null @@ -1,358 +0,0 @@ -require("awful") -require("awful.autofocus") -require("awful.rules") -require("beautiful") -require("naughty") -require("debian.menu") - --- Error handling in startup -if awesome.startup_errors then - naughty.notify({ preset = naughty.config.presets.critical, - title = "Oops, there were errors during startup!", - text = awesome.startup_errors }) -end - --- Error handling in runtime -do - local in_error = false - awesome.add_signal("debug::error", function (err) - -- Make sure we don't go into an endless error loop - if in_error then return end - in_error = true - naughty.notify({ preset = naughty.config.presets.critical, - title = "Oops, an error happened!", - text = err }) - in_error = false - end) -end - --- Theme -beautiful.init("/home/tom/.config/awesome/tyr/theme.lua") - --- Standard terminal -terminal = "urxvtcd" -editor = os.getenv("EDITOR") or "editor" -editor_cmd = terminal .. " -e " .. editor - --- Modkey -modkey = "Mod4" - --- Layouts -layouts = -{ - awful.layout.suit.tile, - awful.layout.suit.tile.left, - awful.layout.suit.tile.bottom, - awful.layout.suit.tile.top, - awful.layout.suit.floating, - 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 -} - --- Tags -tags = { - awful.tag( - {"1:web", "2:tor", "3:game", "4:video", "5:graphics", "6:audio"}, 1, - {layouts[1], layouts[1], layouts[1], layouts[1], layouts[1], layouts[1]} - ), - awful.tag( - {"1:tmux", "2:term", "3:music", "4:torrent", "5:cast", "6:misc"}, 2, - {layouts[1], layouts[1], layouts[1], layouts[1], layouts[10], layouts[1]} - ) -} - --- Menu -myawesomemenu = { - { "manual", terminal .. " -e man awesome" }, - { "edit config", editor_cmd .. " " .. awesome.conffile }, - { "restart", awesome.restart }, - { "quit", awesome.quit } -} -mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, - { "Debian", debian.menu.Debian_menu.Debian }, - { "open terminal", terminal } - } - }) -mylauncher = awful.widget.launcher({ image = image(beautiful.awesome_icon), - menu = mymainmenu }) - --- Clock -mytextclock = awful.widget.textclock({ align = "right" }) - --- System tray -mysystray = widget({ type = "systray" }) - --- Per-screen wiboxes -mywibox = {} -mypromptbox = {} -mylayoutbox = {} -mytaglist = {} -mytaglist.buttons = awful.util.table.join( - awful.button({ }, 1, awful.tag.viewonly), - awful.button({ modkey }, 1, awful.client.movetotag), - awful.button({ }, 3, awful.tag.viewtoggle), - awful.button({ modkey }, 3, awful.client.toggletag), - awful.button({ }, 4, awful.tag.viewnext), - awful.button({ }, 5, awful.tag.viewprev) - ) -mytasklist = {} -mytasklist.buttons = awful.util.table.join( - awful.button({ }, 1, function (c) - if c == client.focus then - c.minimized = true - else - if not c:isvisible() then - awful.tag.viewonly(c:tags()[1]) - end - -- This will also un-minimize - -- the client, if needed - client.focus = c - c:raise() - end - end), - awful.button({ }, 3, function () - if instance then - instance:hide() - instance = nil - else - instance = awful.menu.clients({ width=250 }) - end - end), - awful.button({ }, 4, function () - awful.client.focus.byidx(1) - if client.focus then client.focus:raise() end - end), - awful.button({ }, 5, function () - awful.client.focus.byidx(-1) - if client.focus then client.focus:raise() end - end)) - -for s = 1, screen.count() do - -- Create a promptbox for each screen - mypromptbox[s] = awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright }) - -- 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( - awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), - awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), - awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), - awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) - -- Create a taglist widget - mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.label.all, mytaglist.buttons) - - -- Create a tasklist widget - mytasklist[s] = awful.widget.tasklist(function(c) - return awful.widget.tasklist.label.currenttags(c, s) - end, mytasklist.buttons) - - -- Create the wibox - mywibox[s] = awful.wibox({ position = "top", screen = s }) - -- Add widgets to the wibox - order matters - mywibox[s].widgets = { - { - mylauncher, - mytaglist[s], - mypromptbox[s], - layout = awful.widget.layout.horizontal.leftright - }, - mylayoutbox[s], - mytextclock, - s == 1 and mysystray or nil, - mytasklist[s], - layout = awful.widget.layout.horizontal.rightleft - } -end - --- Mouse bindings -root.buttons(awful.util.table.join( - awful.button({ }, 3, function () mymainmenu:toggle() end), - awful.button({ }, 4, awful.tag.viewnext), - awful.button({ }, 5, awful.tag.viewprev) -)) - --- Standard awesome global controls -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), - - -- Lock screen with mod4+backslash - awful.key({ modkey, }, "\\", - function () - awful.util.spawn("xscreensaver-command -lock") - end), - - awful.key({ modkey, }, "j", - function () - awful.client.focus.byidx( 1) - if client.focus then client.focus:raise() end - end), - awful.key({ modkey, }, "k", - function () - awful.client.focus.byidx(-1) - if client.focus then client.focus:raise() end - end), - awful.key({ modkey, }, "w", function () mymainmenu:show({keygrabber=true}) end), - - -- Layout manipulation - awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), - awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), - awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end), - awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end), - awful.key({ modkey, }, "u", awful.client.urgent.jumpto), - awful.key({ modkey, }, "Tab", - function () - awful.client.focus.history.previous() - if client.focus then - client.focus:raise() - end - end), - - -- Standard program - awful.key({ modkey, }, "Return", function () awful.util.spawn(terminal) end), - awful.key({ modkey, "Control" }, "r", awesome.restart), - awful.key({ modkey, "Shift" }, "q", awesome.quit), - - awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end), - awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end), - awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end), - awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), - awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end), - awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), - awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), - awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), - - awful.key({ modkey, "Control" }, "n", awful.client.restore), - - -- Prompt - awful.key({ modkey }, "r", function () mypromptbox[mouse.screen]:run() end), - - awful.key({ modkey }, "x", - function () - awful.prompt.run({ prompt = "Run Lua code: " }, - mypromptbox[mouse.screen].widget, - awful.util.eval, nil, - awful.util.getdir("cache") .. "/history_eval") - end) -) - --- Standard awesome per-client controls -clientkeys = awful.util.table.join( - awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end), - awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end), - awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ), - awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), - awful.key({ modkey, }, "o", awful.client.movetoscreen ), - awful.key({ modkey, "Shift" }, "r", function (c) c:redraw() end), - awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end), - awful.key({ modkey, }, "n", - function (c) - -- The client currently has the input focus, so it cannot be - -- minimized, since minimized clients can't have the focus. - c.minimized = true - end), - awful.key({ modkey, }, "m", - function (c) - c.maximized_horizontal = not c.maximized_horizontal - c.maximized_vertical = not c.maximized_vertical - end) -) - --- Compute the maximum number of digit we need, limited to 9 -keynumber = 0 -for s = 1, screen.count() do - keynumber = math.min(9, math.max(#tags[s], keynumber)); -end - --- Bind all key numbers to tags -for i = 1, keynumber do - globalkeys = awful.util.table.join(globalkeys, - awful.key({ modkey }, "#" .. i + 9, - function () - local screen = mouse.screen - if tags[screen][i] then - awful.tag.viewonly(tags[screen][i]) - end - end), - awful.key({ modkey, "Control" }, "#" .. i + 9, - function () - local screen = mouse.screen - if tags[screen][i] then - awful.tag.viewtoggle(tags[screen][i]) - end - end), - awful.key({ modkey, "Shift" }, "#" .. i + 9, - function () - if client.focus and tags[client.focus.screen][i] then - awful.client.movetotag(tags[client.focus.screen][i]) - end - end), - awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, - function () - if client.focus and tags[client.focus.screen][i] then - awful.client.toggletag(tags[client.focus.screen][i]) - end - end)) -end - --- Bind mouse actions -clientbuttons = awful.util.table.join( - awful.button({ }, 1, function (c) client.focus = c; c:raise() end), - awful.button({ modkey }, 1, awful.mouse.client.move), - awful.button({ modkey }, 3, awful.mouse.client.resize)) - --- Apply root window bindings -root.keys(globalkeys) - --- Rules for new windows -awful.rules.rules = { - { rule = { }, - properties = { focus = true, - size_hints_honor = false, - keys = clientkeys, - buttons = clientbuttons } }, - { rule = { class = "MPlayer" }, - properties = { floating = true } }, - { rule = { class = "Exe" }, -- youtube fullscreen - properties = { floating = true }}, - { rule = { class = "Steam" }, - properties = { floating = true, - tag = tags[1][3] } }, - { rule = { class = "hl2_linux" }, - properties = { floating = true, - tag = tags[1][3] } }, - { rule = { class = "Screenkey" }, - properties = { floating = true, - tag = tags[2][6], - geometry = { width = 400, - height = 75, - x = 2800, - y = 20 } } } -} - --- Management hooks -client.add_signal("manage", function (c, startup) - - -- 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) - - -- Only place new windows if they don't already have a position - if not startup then - 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 -end) - diff --git a/i3/config b/i3/config new file mode 100644 index 00000000..5337eb6a --- /dev/null +++ b/i3/config @@ -0,0 +1,108 @@ +# Use Mod4 as modifier +set $mod Mod4 + +# Use Verdana as the system font +font pango:Verdana 7 + +# Use Mouse+$mod to drag floating windows to their wanted position +floating_modifier $mod + +# Mod+Shift+r restarts i3wm +bindsym $mod+Shift+r restart + +# Mod+Shift+q logs out of i3wm +bindsym $mod+Shift+q exit + +# Mod+Enter starts a terminal +bindsym $mod+Return exec urxvtcd + +# Mod+Shift+c kills the focussed window +bindsym $mod+Shift+c kill + +# Mod+Shift+d runs Dmenu +bindsym $mod+d exec dmenu_run + +# Mod+Shift+h/j/k/l change focus in a Vimlike way +bindsym $mod+h focus left +bindsym $mod+j focus down +bindsym $mod+k focus up +bindsym $mod+l focus right + +# Mod+Shift+h/j/k/l move the window in a Vimlike way +bindsym $mod+Shift+h move left +bindsym $mod+Shift+j move down +bindsym $mod+Shift+k move up +bindsym $mod+Shift+l move right + +# Mod+backslash splits horizontally +bindsym $mod+backslash split h + +# Mod+minus splits vertically +bindsym $mod+minus split v + +# Mod+f makes the focussed container fullscreen +bindsym $mod+f fullscreen + +# Mod+s/w/e changes to stacking/tabbed/togglesplit layout +bindsym $mod+s layout stacking +bindsym $mod+w layout tabbed +bindsym $mod+e layout toggle split + +# Mod+space toggles between tiled and floating +bindsym $mod+space floating toggle + +# Mod+a/z switches focus between container parent and child +bindsym $mod+a focus parent +bindsym $mod+z focus child + +# Mod+ switches to a workspace +bindsym $mod+1 workspace 1 +bindsym $mod+2 workspace 2 +bindsym $mod+3 workspace 3 +bindsym $mod+4 workspace 4 +bindsym $mod+5 workspace 5 +bindsym $mod+6 workspace 6 +bindsym $mod+7 workspace 7 +bindsym $mod+8 workspace 8 +bindsym $mod+9 workspace 9 + +# Mod+Shift+ moves a container to a workspace +bindsym $mod+Shift+1 move container to workspace 1 +bindsym $mod+Shift+2 move container to workspace 2 +bindsym $mod+Shift+3 move container to workspace 3 +bindsym $mod+Shift+4 move container to workspace 4 +bindsym $mod+Shift+5 move container to workspace 5 +bindsym $mod+Shift+6 move container to workspace 6 +bindsym $mod+Shift+7 move container to workspace 7 +bindsym $mod+Shift+8 move container to workspace 8 +bindsym $mod+Shift+9 move container to workspace 9 + +# Mod+r resizes a container +bindsym $mod+r mode "resize" +mode "resize" { + bindsym h resize shrink width 10 px or 10 ppt + bindsym j resize grow height 10 px or 10 ppt + bindsym k resize shrink height 10 px or 10 ppt + bindsym l resize grow width 10 px or 10 ppt + bindsym Return mode "default" + bindsym Escape mode "default" +} + +# i3bar at bottom of screen +bar { + font pango:Verdana 7 + position bottom + status_command i3status --config ~/.i3/status + workspace_buttons yes + + colors { + background #111111 + statusline #eeeeee + + focused_workspace #ffffff #285577 + active_workspace #ffffff #333333 + inactive_workspace #888888 #222222 + urgent_workspace #ffffff #900000 + } +} + diff --git a/i3/status b/i3/status new file mode 100644 index 00000000..f9ea2982 --- /dev/null +++ b/i3/status @@ -0,0 +1,12 @@ +# i3status -- Just show load average and local time + +order += "load" +order += "tztime local" + +load { + format = "%1min/%5min/%15min" +} +tztime local { + format = "%Y-%m-%d %H:%M:%S" +} + diff --git a/install b/install index f6a5aee7..7c6c7d2d 100755 --- a/install +++ b/install @@ -102,12 +102,12 @@ while getopts :gmntx opt; do lns "$dotfiles"/tmux/tmux.conf "$HOME"/.tmux.conf ;; x) + lns "$dotfiles"/i3 "$HOME"/.i3 lns "$dotfiles"/X/Xmodmap "$HOME"/.Xmodmap lns "$dotfiles"/X/Xresources "$HOME"/.Xresources lns "$dotfiles"/X/xsession "$HOME"/.xsession lns "$dotfiles"/X/xsessionrc "$HOME"/.xsessionrc lns "$dotfiles"/vim/gvimrc "$HOME"/.gvimrc - lns "$dotfiles"/awesome "$HOME"/.config/awesome ;; esac done -- cgit v1.2.3